指针
内存中的地址是按照字节进行划分,每一个字节对应着一个地址
64位操作系统与32位的区别:指的是编址形式
32位地址中能表示2^32 个地址[0 , 2^{32} -1]
2^32 = (2 ^ 2) * (2 ^30 )=4GB=2^10 kb
超过4GB的内存无法识别
同理,64位OS 2^64实际上无上限
8位二进制 = 1字节
指针变量占几个字节?
32位OS占4字节
64位OS占8字节
int a;// &a有4个地址且连续,取a的首地址
指针变量也是变量,
变量:
1.用来存值
2.有类型
3.有大小
4.有地址
指针变量:
1.用来存地址
2.指向类型
3.大小分32位OS与64
4.有自己的地址
int a;
int *p = &a; //定义了一个指针变量p,*为指针的标志,初始化操作将a变量的地址赋给p
*p = 5; // *p访问当前地址下的值,*p等价于原始变量a
//上述三行相当于int a =5
*p //取指针变量的首地址
指针变量的运算
只有两种,+与-
指针类型的作用?进行计算
int *p; //p+1偏移4个字节
char *q; //q+1偏移1个字节
double *k; //k+1偏移8个字节
//偏移其类型对应的字节数
//二级指针:指向指针的指针
int a;
int *p = &a; //p指向a的首地址0x187c20
*p = 5;
int **q;//二级指针
q = &p;//q指向p的首地址0x276B30
scanf("%d",&n); //函数调用,需要传入地址
重点
*p 等价于a(原始变量)
p+1 等价于&p[1]
p->filed 等价于 (p).filed等价于a.filed
练习:尽可能写出更多的形式表示a[1].x
struct Data{
int x,y;
};
int main(){
struct Data a[2],*p=a;
a[0].x = 0,a[1].y = 1;
a[1].x = 2,a[1].y = 3;
printf("a[1].x = %d\n",a[1].x);
printf("p[1].x = %d\n",p[1].x);
printf("(&a[1])->x = %d\n",(&a[1])->x); //注意()
printf("(&p[1])->x = %d\n",(&p[1])->x);
printf("(a+1)->x = %d\n",(a+1)->x);
printf("(p+1)->x = %d\n",(p+1)->x);
printf("(&a[0]+1)->x = %d\n",(&a[0]+1)->x);
printf("(&p[0]+1)->x = %d\n",(&p[0]+1)->x);
return 0;
}
typedef:类型重命名
网友评论