6-C指针
(1)指针定义的理解
① 指针,存放内存地址的变量,长度固定,32位系统中长度为4,说白了就是寻址位数。
② 指针也是变量,那么免不了被存取,当然就会有存放此指针的地址,用&p获取;
1 int i=10; 2 int *p_t=&i; 3 4 int main() 5 { 6 printf("0x%p,0x%X\r\n",p_t,&i);//指针变量存放的i变量的地址值 7 printf("%x\r\n",*p_t);//指针所指向的 内存的数据 8 printf("%x\r\n",&p_t);//指针变量本身的地址 9 }
(2)指针p[-1]代表什么?
int num[10] = {0,1,2,3,4,5,6,7,8,9};
int *p = num+2;//此时p代表的是num[2]的地址,p[0]就是num[2],p[-1]就是num[1],p[-2]就是num[0]; 但是p[-3]就错了,因为你访问了一个未知的地址,会出现严重错误的。
(3)数组名的理解
int a[10]; 其中a是数组名,数组首元素的地址。
下面两种情况数组名代表整个数组的地址:
① sizeof(a) = 10*4 表示整个数组在内存中的大小;
② &a 取出来的值是和第一个数组元素地址一致(sizeof(&a)=4),但是其偏移量不是一个元素的大小,而是整个数组的大小;
(4)同一个数组的指针相减,得到的是他们之间元素的个数。
&p[4][2] - &a[4][2] = &a[3][3] - &a[4][2]
&p[4][2]: &a[0][0]+sizeof(int)*3*5 + 3*sizeof(int)
&a[4][2]: &a[0][0]+sizeof(int)*4*5+2*sizeof(int)
如果直接用&p[4][2] - &a[4][2] 相减得到的是 -4 * sizeof(int) = -16, 但是对于同一个数组的指针相减,虽然两者的地址相差16,所得到的是他们之间元素的个数。
所以十进制打印出来的结果是 -4。
1 int main() 2 { 3 int a[5][5]; 4 int (*p)[4]; 5 6 p = a; 7 printf("%d, %p,%p",(&p[4][2]) - (&a[4][2]),&p[4][2],&a[4][2]); 8 9 return 0; 10 }
函数指针:
指针数组:
posted on 2020-12-27 17:20 Darren_pty 阅读(152) 评论(0) 编辑 收藏 举报