Darren_pty

导航

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  阅读(147)  评论(0编辑  收藏  举报