C语言 有关*p=a,**q=&p;的问题
p是个指针(一级指针),把a的值赋给p所指向的地址,q是个二级指针(也就是指针的指针),q中保存这p的地址
答:*p=*q与p=q的本质区别在于:*p=*q操作的是变量存储的数值,p=q操作的是指针变量本身
C语言中,指针操作主要有以下三种情况:
*p 是指针变量p指向的变量a的存储内容,*p = 5;
p 是指针变量的存储内容,因为p指向a,所以p的存储内容(存储空间的值)就是系统为变量a分配的存储地址;
&p 是对指针变量p进行取地址的操作。
扩展资料:
指针的机制比较简单,其功能可以被集中重新实现成更抽象化的引用(reference)数据形别。
许多编程语言中都支持某种形式的指针,最著名的是C语言,但是有些编程语言对指针的运用采取比较严格的限制,如Java一般避免用指针,改为使用引用。
有两种含义,一是作为数据类型,二是作为实体。
指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量。指针一般出现在比较底层的程序设计语言中,如C语言。高层的语言如Java一般避免用指针,而是引用。
指针作为数据类型,可以从一个函数类型、一个对象类型或者一个不完备类型中导出。从中导出的数据类型称之为被引用类型(referenced type)。指针类型描述了一种对象,其值为对被引用类型的实体的引用。
C++标准中规定,“指针”概念不适用于成员指针(不包含指向静态成员的指针)。C++标准规定,指针分为两类:
1、object pointer type:指向void或对象类型,表示对象在内存中的字节地址或空指针。
2、function pointer type:指代一个函数
C中函数调用是按值传递的,传入参数在子函数中只是一个初值相等的副本,无法对传入参数作任何改动。但实际编程中,经常要改动传入参数的值。
这一点我们可以用传入参数的地址而不是原参数本身,当对传入参数(地址)取(*)运算时,就可以直接在内存中修改,从而改动原想作为传入参数的参数值。
(*p)操作是这样一种运算,返回p 的值作为地址的那个空间的取值。(&p)则是这样一种运算,返回当时声明p 时开辟的地址。显然可以用赋值语句对内存地址赋值。
参考资料来源:百度百科-指针
int *p=a,//此时p指向a[0],也就是1
**q=&p;//此时q指向p
printf("%d\n",*(p++));//这句相当于下面的两句的合并:
/*
printf("%d\n",*p);//按照p寻址并输出,此时p指向a[0],于是输出1
p=p+1;//p指针向前移动,此时p指向a[1],也就是2
*/
printf("%d\n",**q);//按照q二次寻址输出。q指向p,p指向a[1],于是输出a[1],也就是2
p是一个一维指针,它指向数组a的第一个元素a[0],
*(p++)会先取p当前指向的地址并做解引用得到a[0]元素的值,然后再将p指针移位指向相邻的下一个元素(即a[1]元素)
q是一个二维指针(可以理解为指针的指针),它指向了指针p,所以*q得到的是指针p现在指向的地址(即a[1])**q相当于*p,由于上一条语句中,p移动到了a[1]元素,所以这里得到的就是a[1]
万非艾迪: *p=*q是把q指针所指向地址里存放的数值赋给p指针指向的地址,简单说就是把q指向的变量里的值赋给p指针指向的变量 *P= &Q 是错的除非是在定义的时候可以.int *p=&q; *p=q啥也不是.
兰州市19894236890: C语言中指针的指真如**q=&p怎么解释啊? - ?
万非艾迪: 参考答案:我是这样认为的:*是指针运算符.我们曾可以这样去定义:int a[10],*p,**s; 如果在下面的语句中出现了*p=a; 这就意味着指针p已经指向数组的首地址,也就是a[0], 此时我们可认为指针p是一级指针. 如果在下面的语句中出现了*s=p, 这就意味着指针s指向了p的单元,而p指向了a[0] 此时s离数组的首地址形象的像隔了2级 因此称s为2级指针. 对于2级指针,有**s=*(*s)=*p=&a[0]
兰州市19894236890: 在C语言中指针函数*p=&q,是什么意思?“*”和“&”什么作用? - ?
万非艾迪: * 表示声明了一个指针变量,& 表示取出变量的内存地址.*p=&q 的意思就是把q的内存地址取出来,赋值给指针p.
兰州市19894236890: main(){int a[5]={2,4,6,8}};int *p=a,**q=&p;printf(“%d”,*(p++));printf(“%d”,**q);}的输 - ?
万非艾迪: 不可能是4,4,而是2,4.p++是后++,所以*(p++)的值就是*p的值,亦即a[0]的值2;2输出后,要执行p++使p指向了4,而q是指向p的,所以**q就是*p,现在p指向4了,当然*p就是4,亦即**q的值是4.
兰州市19894236890: 请教C语言关于指针的问题 - ?
万非艾迪: (1)int *p,*q; q=p; // 未经赋值的指针变量不能使用 int a,*p,*q; p=q=&a; // 这个应该是正确的(2)int a,*p,*q; q=&a; p=*q; // p=*q;明显错误 int a=20,*p; *p=a; //*p=a错误,可以改成p=&a就对了,*p是指针变量p所指向的变量,连地址都没有 ,...
兰州市19894236890: c语言,一个函数,为什么指针指向的值是a[1]? - ?
万非艾迪: 不对**p无意义, 你应该是打错了 q指向了p, 所以*q 等价于p, 所以**q等价于*p p一开始指向a[0], 但是第一个输出有个自增运算, 所以那一行执行完以后, p指向a[1] 所以*p就是a[1]的值, 所以**q输出的是2
兰州市19894236890: 在c语言中p=&q和*p=q意思一样吗? - ?
万非艾迪: 你好,先说结论,是不一样的.第一个,是正确的使用.p=&q 指针指向一个变量的地址 第二个,*p=q 指针的指向不明,并将不明的地址中的值改为 q.虽说两个赋值表达式 *p 的值是一样的,但是p的指向会不一样.给随机内存赋值,是会出段错误的.祝你生活愉快.
兰州市19894236890: c语言指针一块中,语句 *p=&a与p=&a的区别所在 - ?
万非艾迪: p=&a 表示p是一个 一级指针,把a的地址赋值给p,或者是p指向a的地址.*p=&a 表示p是一个二级指针,把a的地址赋值给*p,或者是*p指向a的地址.
兰州市19894236890: c语言中*p=a与*p=&a有什么区别 - ?
万非艾迪: 让我来综合一下吧 在定义的时候 int *p=&a; 是等同于 int=*p; p=&a;的.该形式只在定义的时候是正确的.就是指针p所指向地址的内容为a的内容. 如果不是定义的时候 *p=&a; 就是它字符的那个意思,就是指针p所指向地址的内容为a的地...
兰州市19894236890: 在c语言中,int *p,a; *p=&a,和p=&a有什么区别? - ?
万非艾迪: 这样问说明你对指针的概念还不清楚,以下两种方式等价:一、先声明指针,再给指针赋值 int *p,a; p=&a; 二、定义指针的同时给它赋值 int a,*p=&a; //这里的*p可以解释成int * p,int *表示p是指向int型变量的指针