知识点整理:
1、计算机操作系统OS给内存中的每个字节一个连续的地址编号,每个字节拥有一个连续增长的地址编号。
2、在32位操作系统中,一个指针变量占4字节;在64位操作系统中一个指针变量占8字节。
3、32位OS最多可以给2^32个字节编号。
4、指针变量也是变量,存的值为地址。
5、下图为一级指针变量p与变量a的关系:
代码展示:
#include<stdio.h>
int main(){
int a=123;
int *p=&a;
int **q=&p;
printf("a=%d &a=%d p=%d &p=%d *p=%d q=%d &q=%d *q=%d **q=%d\n",a,&a,p,&p,*p,q,&q,*q,**q);
return 0;
}
运行结果:
a=123 &a=1339599740 p=1339599740 &p=1339599744 *p=123 q=1339599744 &q=1339599752 *q=1339599740 **q=123
如下例题,用不同的形式表示a[1].x:
#include<stdio.h>
struct Node{
int x=100,y=200;
};
int main(){
struct Node a[2],*p=a;
//用不同的形式表示a[1].x
printf("a[1].x=%d\n",a[1].x);
printf("(*(a+1)).x=%d\n",(*(a+1)).x);
printf("(*(&a[0]+1)).x=%d\n",(*(&a[0]+1)).x);
printf("(*(&a[1])).x=%d\n",(*(&a[1])).x);
printf("(a+1)->x=%d\n",(a+1)->x);
printf("(&a[0]+1)->x=%d\n",(&a[0]+1)->x);
printf("(&a[1])->x=%d\n",(&a[1])->x);
printf("(p+1)->x=%d\n",(p+1)->x);
printf("(*(p+1)).x=%d\n",(*(p+1)).x);
printf("(&p[0]+1)->x=%d\n",(&p[0]+1)->x);
printf("(*(&p[0]+1)).x=%d\n",(*(&p[0]+1)).x);
printf("p[1].x=%d\n",p[1].x);
printf("(*(&p[1])).x=%d\n",(*(&p[1])).x);
printf("(&p[1])->x=%d\n",(&p[1])->x);
//printf("p[1]->x=%d\n",p[1]->x);//有误!
//printf("(&a+1)->x=%d\n",(&a+1)->x);//有误!
//printf("(*(&a+1)).x=%d\n",(*(&a+1)).x);//有误!
//printf("(*(&p+1)).x=%d\n",(*(&p+1)).x);//有误!
//printf("(&p+1)->x=%d\n",(&p+1)->x);//有误!
return 0;
}
示例运行结果:
a[1].x=100
(*(a+1)).x=100
(*(&a[0]+1)).x=100
(*(&a[1])).x=100
(a+1)->x=100
(&a[0]+1)->x=100
(&a[1])->x=100
(p+1)->x=100
(*(p+1)).x=100
(&p[0]+1)->x=100
(*(&p[0]+1)).x=100
p[1].x=100
(*(&p[1])).x=100
(&p[1])->x=100