文章目录
- 指针变量内存
- 指针详解
- 例1
- 例2
- 练习&答案解析
指针变量内存
int main(){
// 各类型变量占字节数
printf("char: %d\n",sizeof(char)); // 1
printf("short: %d\n",sizeof(short)); // 2
printf("int: %d\n",sizeof(int)); // 4
printf("float: %d\n",sizeof(float)); // 4
printf("double: %d\n",sizeof(double)); // 8
printf("\n");
// 各类型指针变量(不论几级指针)占8字节(64位系统)
printf("char*: %d\n",sizeof(char*));
printf("short*: %d\n",sizeof(short*));
printf("int*: %d\n",sizeof(int*));
printf("float*: %d\n",sizeof(float*));
printf("double*:%d\n",sizeof(double*));
// 各类型指针变量(不论几级指针)占4字节(32位系统)
return 0;
}
指针详解
&:取地址
*:解引用(指向值)
例1
在计算机内存中,变量的内存基本上都由一段连续的内存空间组成,所以变量的地址指开辟空间的首地址
int main() {
int a = 10;
// 指针==地址
int *p = &a; // p 指针变量
printf("*p-> %d\n", *p);
return 0;
}


例2
在计算机内存中,肯定不会有图例的箭头,所以*p就代表指向的内容
int main() {
int a = 10;
int b = 20;
int *p = NULL;
int **s = NULL;
p = &a;
s = &p;
return 0;
}

练习&答案解析
请依次写出执行语句1和语句2后&p、*p、p、**s、*s、&s、s的值
int main() {
int a = 10; // 已知--&a:0xed209ffa94
int b = 20; // 已知--&b:0xed209ffa90
int *p = NULL;
int **s = NULL;
p = &a; // 已知--&p:0xed209ffa88
s = &p; // 已知--&s:0xed209ffa98
*p = 100; // 语句1
*s = &b; // 语句2
return 0;
}
答案&解析:
1.执行完*p = 100
&p :0xed209ffa88——指针变量p的地址
*p :100——语句1相当于执行a=100,改变了a的值,*p就是a
p : &a 或 0xed209ffa94——变量a的地址 赋值给 指针变量p自身的值
&s :0xed209ffa98——指针变量s的地址
*s :&a 或 0xed209ffa94——指针变量p自身的值,变量a的地址
**s:100——**s相当于*p,执行了语句1之后,*p=100,所以**s=100
s :0xed209ffa88
2.执行完*s = &b
&s :0xed209ffa98——指针变量p的地址
*s : &b 或 0xed209ffa90——执行了语句2之后,变量b的地址 赋值给 指针变量s指向的值;*s相当于指针变量p自身的值,所以相当于让指针变量p指向变量b,相当于p=&b,相当于*p=20
**s :20——**s相当于*p,指针变量p指向的值,由上面*s的解析内容可得
s : &p 或 0xed209ffa88——指针变量p的地址 赋值给 指针变量s自身的值
&p :0xed209ffa88——指针变量p的地址
*p :20——根据上面*s的解析内容可得
p : &b 或 0xed209ffa90——根据上面*s的解析内容可得



















