首先申明本文是个人学习总结,是凭借自己的理解总结的。其中一些理解可能有错误,欢迎指出。代码是自己跑通了的。
指针什么的一直搞不清楚,这几天花了些时间一次性全部解决。
```c
#include<stdio.h>
#include<string.h>
int main(void)
{
int a[5] = { 1,2,3,4,5 };
int *q = a;
int *w = &a;
int *e = (int*)(&a[0]+1);
int *p = (int*)(&a+1);
printf("%d\n", a);
/*这一句直接printf a,打印的不是1,2,3,4,5数组a中的元素,而是a这个数组的地址,
这个地址是数组a的首地址,也就是a[0]的地址,所以,数组名是这个数组的首地址,如要
逐个打印数组中的元素用for或者while循环*/
printf("%d\n", &a[0]);
//这一句打印a[0]的地址,可以看到a的地址就是a[0]的地址
printf("%d\n", &a+1);
//这一句可以看到数组a的地址加1,加了20个字节,这里+1加的是sizeof(a),是20个字节
printf("%d\n", &a[0]+1);
//这一句可以看到元素a[0]的地址加1,加了4个字节,这里+1加的是sizeof(a[0]),加的是4个字节
printf("%d\n", *q);
/* *q=a;或者q=&a;意思是q是指针变量,q中保存的是a的地址,*是取值运算符,*是取q保存
的这个地址当中的值,或者说是q指向a,&是取地址运算符,&a是取a的地址。所以q保存a的地址,也就是
a[0]的地址,*q就是取a[0]地址中的值,1*/
printf("%d\n", *w);
/*一般来说int *w = &a;这种表示方法是错的,正确的表示方法应该是上一句,但是这样写也能得到
正确的值*/
printf("%d\n", *e);
/*int *e = (int*)(&a[0]+1);这一句先取a[0]的地址,a[0]的地址+1是a[1]的地址,(int*)表示
整型指针,(&a[0]+1)是一个地址,(int*)(&a[0]+1)是一个指针,要么int *e; e=&a[0]+1;
要么int *e = (int*)(&a[0]+1);*/
printf("%d\n", *(p-1));
/*int *p = (int*)(&a+1); 这里&a是16120640,&a+1是&a加一个sizeof(a),就是加20,所以
&a+1是17824160,则p=17824160,因为p的类型是(int*)整型指针,所以sizeof(p)=4;所以p-1
减去一个字节,p-1是17824156,这个地址是a[0]的地址加16个字节,是a[4]的地址,所以是输出
结果是5*/
return 0;
}
//输出结果
//---------------------------------
16120640
16120640
17824160
17824144
1
1
2
5
请按任意键继续. . .
//--------------------------------------------