**p表示p也表示地址,简单的说,这个地址对应的存储单元存储的数也是一个地址,而不是数值,而这个被存储的地址对应的存储单元存储的数据才是真正的相应类型的数值!
例如:
int i=10//定义了一个整型变量
int *p=&i//定义了一个指针指向这个变量
int **p1=&p//定义了一个二级指针指向p指针
那么取出10的值方式为:
printf(“i=[%d]\n”,*p)
printf(“i=[%d]\n”,**p1)
扩展资料:
指针与数组关系
指针数组:就是一个由指针组成的数组,那个数组的各个元素都是指针,指向某个内存地址。 char *p[10]//p是一个指针数组
数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是一个常数。
example:
char (*p)[10]//p是一个数组指针
函数指针:本身是一个指针,指向一个函数入口地址,通过该指针可调用其指向的函数,使用函数指针可实现回调函数。
参考资料来源:百度百科-指针
我假设楼主是入门者,所以做入门的回答。p++
这个表达式等价于: p = p+1(或者p+=1)
楼主的困惑发生在对指针、指针的类型及指针的运算的理解不足上。
1. 指针的本质是一个值,代表一个内存地址。所以,指针的基本功能就是指出(point to)一个地址。
2.指针的类型,是指:指针所指出的那个地址里存放的那个数据的类型。也就是 (*p)d的类型。
3. 进行p++或p = p+1;运算隐含一个假设:运算之前的p指向了一个类型为(*p)的数组(这样说是便于入门者理解,也可以说队列)中的某一个元素。p++(或者p=p+1,或p+=1)的结果就是p指向了这个数组的下一个相邻的元素。
地址 内存
0x0000 | |
0x0001 | |
.
.
.
0x80F4 | |<-------p(假设运算前p 的值为 0x80F4)
0x80F5 | |
0x80F6 | |
0x80F7 | |
0x80F8 | |
0x80F9 | |
0x80FA | |
运算之后:
0x80F4 | |<-------p(假设运算前p 的值为 0x80F4)
0x80F5 | | <-------(p++)(当 定义为 char *p )
0x80F6 | | <-------(p++)(当 定义为WORD *p )
0x80F7 | |
0x80F8 | | <-------(p++)(当 定义为DWORD *p )
0x80F9 | |
0x80FA | |
.
.
0x80FF | |
0x8100 | | <-------(p++)(当p 定义为struct StructName *p ,且结构长度为12)
楼主可以继续学习指针的概念。尤其建议探究 指针与数组 的异同,可能会让你豁然开朗。比如:
*p 与 p[0] 等值,同样(p++) 与 p[1] 等值(但p++改变了p),且完全符合C语法。
最后郑重告知楼主:
1. C语言,成于指针,败于指针;
2. 不能百分之百确认前,勿用指针
3. 不能熟练运用指针前,不要声称自己熟练使用C语言
4. 熟练使用C语言后,请大胆、大量的运用指针,包括函数指针
5.下学ASM,上学C++,使用C:精通C
p是指针变量,其值是一个变量的地址。p收到了哪个变量的地址,就指向哪个变量。该变量成为p的对象。
*p是p所指向的对象的值。
例如:inti=3,*p
p=&i注意:p收到i的地址,故p指向i,i是p的对象。
printf("%d,%d\n",i,*p)输出:3,3注意:*p是p所指向的对象的值,即i的值。
C语言
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。