文章目录
- 指针变量内存
- 指针详解
- 例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
的解析内容可得