C语言中指针是什么?

恶名昭著的指针究竟是什么

“ 指针是一种保存变量地址的变量,在 C 中频繁地使用。”

“指针类型”其实不是单独存在的,它是由其他类型派生而成的

因为“指针类型”是类型,所以它和 int 类型、double 类型一样,也存在“指针类型变量”和“指针类型的值”。糟糕的是,“指针类型”、“指针类型变量”和“指针类型的值”经常被简单地统称为“指针”,所以非常容易造成歧义,这一点需要提高警惕*

注意:
先有“指针类型”。
因为有了 “指针类型”,所以有了“指针类型的变量 ”和 “指针类型的值”。

指针类型同样如此,既存在指针类型的变量,也存在指针类型的值
因此,几乎所有的处理程序中,所谓的“指针类型的值”,实际是指内存的地址

举个例子:

#include <stdio.h>


int main(void)
{
    int hoge = 5;
    int piyo = 10;
    int *hoge_p;


    /*输出每个变量的地址*/
    printf("&hoge..%p\n", &hoge);
    printf("&piyo..%p\n", &piyo);
    printf("&hoge_p..%p\n", &hoge_p);


    /*将hoge 的地址赋予hoge_p*/
    hoge_p = &hoge;
    printf("hoge_p..%p\n", hoge_p);


    /*通过hoge_p 输出hoge 的内容*/
    printf("*hoge_p..%d\n", hoge_p);


    /*通过hoge_p 修改hoge 的内容*/
    *hoge_p = 10;
    printf("hoge..%d\n", hoge);
    
    return 0;
}

在我的环境下输出:

//Red Hat 4.4.7-17   gcc version 4.4.7
&hoge..0x7ffefe4950ac
&piyo..0x7ffefe4950a8
&hoge_p..0x7ffefe4950a0
hoge_p..0x7ffefe4950ac
*hoge_p..-28749652
hoge..10

因为存在“指针类型”,所以存在“指针类型的变量”和“指针类型的值”。这里输出的“地址”,是指“指针类型的值”

指针变量 hoge_p 保存了另外一个变量 hoge 的地址,我们认为“hoge_p 指向hoge“

变量不一定按照声明的顺序保存在内存中

在指针前面加上*,可以表示指针指向的变量

因为hoge_p 和 hoge 表示同一个事物,通过hoge_p 输出 hoge 的值之外,还可以赋值。在第 22 行,通将 10 赋给*hoge_p,修改了 hoge 的值。在第 23 行输出 hoge 的值,运行结果为 10。

总结:
对变量使用&运算符,可以取得该变量的地址。这个地址称为指向该变量的指针。
指针变量 hoge_p 保存了指向其他变量的地址的情况下,可以说“hoge_p 指向 hoge”。
对指针变量运用运算符,就等同于它指向的变量。如果 hoge_p 指向 hoge,hoge_p 就等同于 hoge

int *hoge_p;
似乎这里声明了一个名为*hoge_p 的变量,而实际上,这里声明的变量是hoge_p,hoge_p 的类型是“指向 int 的指针”。

int* a, b;
声明两个“指向int 的指针”?——其实不是printf("a = %p, b = %d\n",a, b);

int hoge[10];
这本身是不符合 “ 类型 变量名” 的的形式的(C语言就是这样乱的)
Java 在声明“int 的数组”时,通常写成 int[] hoge; 感觉更合理一些

关于main只有这两种形式

int main(int argc, char *argv[]) or int main(void)
posted @ 2019-10-18 22:14  CodeAllen  阅读(1051)  评论(0编辑  收藏  举报