C语言指针详解
程序员文章站
2022-07-02 16:58:12
c语言指针 以下讲解是按照如下这个程序的执行顺序来讲解的 先做如下定义并把详细信息打印出来 指针p定义的时候没有进行初始化,所以在这里,p的初始值是不确定的。当然也可以在p定义的时候赋初值,这样p的初始值就是确定的了。 一元运算符&可用于取一个对象的地址,如下,这时p为指向a的指针。地址运算符&只能 ......
c语言指针
以下讲解是按照如下这个程序的执行顺序来讲解的
1 int a,b; //这是一个普通的整型变量 2 int *p;//这是一个整形的指针 3 a = 3; 4 b = 4; 5 6 7 printf(" a的地址:%d;\r\n", &a); 8 printf(" b的地址:%d;\r\n", &b); 9 printf(" p的地址:%d;\r\n", &p); 10 printf(" p的值:%d,现在p的值是不确定的,目前只是为p申请了地址,还没有为它赋值;\r\n", p); 11 12 p = &a;//取址运算/* p现在指向a */ 13 printf(" 利用取址操作p = &a;,把a的地址赋值给p,现在p的值是%d,也就是a的地址;\r\n", p); 14 printf(" p的地址没有变化,p的地址仍然是%d,在这个地址上存储的是变量a的地址;\r\n", &p); 15 16 printf(" 利用*运算符得到指针p指向地址中的数值为%d,在刚才p已经指向变量a的地址了,所以指针p指向地址中的值是3,但是p的值仍然是a的地址;\r\n", *p); 17 18 b = *p;/* b现在为a的值 */ 19 printf(" b = *p;,现在b的值就是p指向地址中的值,也就是a的值:%d;\r\n", b); 20 21 *p = 5;/* a现在为5 */ 22 printf(" 现在利用*p为p指向地址中存储的值进行赋值:%d,这时a的值也已经改变了:%d;\r\n", *p,a);
先做如下定义并把详细信息打印出来
1 int a,b; //这是一个普通的整型变量 2 int *p;//这是一个整形的指针 3 a = 3; 4 b = 4; 5 6 printf(" a的地址:%d;\r\n", &a); 7 printf(" b的地址:%d;\r\n", &b); 8 printf(" p的地址:%d;\r\n", &p); 9 printf(" p的值:%d,现在p的值是不确定的,目前只是为p申请了地址,还没有为它赋值;\r\n", p);
指针p定义的时候没有进行初始化,所以在这里,p的初始值是不确定的。
当然也可以在p定义的时候赋初值,这样p的初始值就是确定的了。
1 p = 1;
一元运算符&可用于取一个对象的地址,如下,这时p为指向a的指针。地址运算符&只能应用于内存中的对象,即变量与数组元素。它不能作用于表达式、常量或register类型的变量。
这时p的值是3930420,即变量a的地址;
利用&取出p的地址仍然为3930396,没有变;
利用间接寻址*,*p可以得到指针p指向地址中的值为3,即a的值。
1 p = &a;//取址运算/* p现在指向a */ 2 printf(" 利用取址操作p = &a;,把a的地址赋值给p,现在p的值是%d,也就是a的地址;\r\n", p); 3 printf(" p的地址没有变化,p的地址仍然是%d,在这个地址上存储的是变量a的地址;\r\n", &p); 4 5 printf(" 利用*运算符得到指针p指向地址中的数值为%d,在刚才p已经指向变量a的地址了,所以指针p指向地址中的值是3,但是p的值仍然是a的地址;\r\n", *p); 6
利用*可以得到p地址中的数值,这里b的值就是3,即a的值。
1 b = *p;/* b现在为a的值 */ 2 printf(" b = *p;,现在b的值就是p指向地址中的值,也就是a的值:%d;\r\n", b);
对*p进行赋值后,也就是对p指针指向地址中的数值进行赋值,这是a的值也就变为了5
*p = 5;/* a现在为5 */ printf(" 现在利用*p为p指向地址中存储的值进行赋值:%d,这时a的值也已经改变了:%d;\r\n", *p,a);