1.定义指针:
int c = 10;
float b = 3;
int *a1 = &c;//正确
int *a2 = &b;//错误;指针只能与之对应的类型的数据的地址
int *a3 = c;//错误;指针变量只能存地址 不能存具体值
//‘&’ 取某个变量的地址
2.除了定义指针变量时,其余时候指针都是访问某个地址的值,例:
int c= 20;
int *temp = &c;//定义指针变量
*temp = 21; //访问temp地址里面的数据 赋值为20
3.关于指针的小知识点:
a.指针变量的值是一个地址, 这个地址不仅可以是变量的地址, 也可以是其它数据结构的地址,例:
//数组指针:
int a2[10] = {};
int *pa2 = a2;
//函数指针:
int(*pFunc)(int) = test;
int test(int a){
return 0;
}
b.另外,指针在定义时必须赋予初值,如果初值不确定,则赋值为NULL。(NULL指向内存的起始地址)
c.指针变量本身在内存里面占据8个字节内存空间。
4.指针与数组的关系:
数组名并不是一个变量 ,系统没有分配内存空间(数组名表示数组第一个元素的地址) ;
而指针变量是有内存空间的。
在使用时的差异:
int score[5] = {39,32,87,58,27};
for (int i = 0; i < 5; i++) {
printf("%d ",score[i]);
}
for (int i = 0; i < 5; i++) {
printf("%d ", *(score + i));
}
5.练习:
int a = 10;
int *pa = &a;
int a2[10] = {};
int *pa2 = a2;
char c = 'a';
char *pc = &c;
printf("%lu\n",sizeof(a)); //内存里面占据4个字节内存空间
printf("%lu\n",sizeof(pa));//内存里面占据8个字节内存空间
printf("%lu\n",sizeof(a2));//内存里面占据40个字节内存空间
printf("%lu\n",sizeof(pa2));//内存里面占据8个字节内存空间
int score[5] = {39,32,87,58,27};
printf("%p\n", score); //打印地址:0x7ffeefbff4d0
printf("%p\n", score+1);//打印地址:0x7ffeefbff4d4(score+1 = 0x100 + 1 * 4 = 0x104)
printf("%d\n", *(score+1));//打印结果:32
printf("%d\n", *score+1);//打印结果:40
一个小坑:
int score2[5] = {39,32,87,58,27};
printf("%d\n", (*score2)++); //打印结果:39
printf("%d\n", score2[0]); //打印结果:40(注意:不是39;上一个语句执行完,已经加1)
printf("%d\n", ++*score2); //打印结果:40
网友评论