C语言中指针是什么?

学习交流可加

微信读者交流①群 (添加微信:coderAllen)
程序员技术QQ交流①群:736386324

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

“ 指针是一种保存变量地址的变量,在 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)

更多精彩文章扫码关注 [ Allen有话说 ],专注于编程,职场,英语(外企)
扫码关注

猜你喜欢

转载自www.cnblogs.com/Allen5G/p/11701155.html