c语言里,如何把指针变量的地址赋给一个变量?

int *p,*q;
p=new int;
*p=30;
*q=p;
最后一句报错,换成q=&p;不行
换成int a=p; *q=a; 不行
所以,想问,如何把指针变量的地址---注意:是地址的地址,而非指向的地址---赋给另外一个变量?

指针变量的地址只能赋给指针变量。

#include "stdio.h"

int main()

{double pi=3.1415926,*p,**q;

 p=π            /*把double变量的地址赋给p   */

 q=&p;            /*把指针变量p的地址赋给q   */

 printf(" pi=%.7lf\n *p=%.7lf\n**q=%.7lf\n",pi,*p,**q);     /*检查赋值的效果  */

 system("pause");

 return 0;

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-14
p是指针变量,取p地址的地址赋值给一个变量,用&p,这是对的。
问题在于用来存储这个结果的变量是什么类型的,应该是指向指针的指针,int **q。

int *p, *q
p=new int;
*p = 30;
*q = p; // 直接访问*q是危险的!应该先给q赋值再访问*q,比如 q= new int;

q = &p; // 类型不对,定义 int **q, 才可以 q= &p追问

您说的对,先谢谢。
如果我没有理解错,用new,是在 堆 里开辟一个空间吧?
那我想实现这样一个结构(不考虑定义链表结构),用堆中的一个地址p保存第二个地址q,第二个地址的值进行赋值,用指针p来表示第二个地址的值

int *p,*q;
p=new int;
q=new int;
*p=int(q);
*q=8;

到这里都可以编译通过,但问题是我如何用p表示出8这个值呢?

追答

1.首先,int(q) 是c++的语法,意为“构造”一个int类型的实例。C是不能这么用的,C一般用(int)q这种写法。
2. *p = int(q)的意思是对 *p ,即p所指向的地址赋值,所赋的值是一个int类型的数据,其值“恰好”等于q的值而已,与q本身及其所指向的内容没有关系。 你可以试试这样写 *p = int( main)。
本质上,一个强制类型转换,将任意的东西强制转换成int,即然你已经强制转换了,一般情况下编译是不会再报错的。
3.怎么用p表示8的问题,*(int *)(*p)。这里*p 与 q的值一样,但类型不同,强制转换一下,变成指针,再用*取内容,即8.

结论,指向指针的指针,int **p,还是没搞明白吧。

追问

好吧,其实我一直是说的C++。。。。怨我,少打了2个加号

追答

为了代码复用,C++在类及类的相关定义方面加强了很多。指针方面,C和C++的差别不大。

本回答被提问者采纳
第2个回答  2013-10-14
p=new int; -- new 是 C++ 里的东西,不能用于C。要用 malloc

#include<stdio.h>
main(){
int *p,*q; // 声明指针 p,q
p= (int *) malloc(sizeof(int)); // 给 p 分配 1个 int 单元
*p=30;
q=p; // p 的地址赋给 q
printf("address: p=%p q=%p\n", p,q); // 输出 p,q 地址
printf("value: p=%d q=%d\n", *p,*q); // 输出 p,q 指向的值
return 0;
}

============
也允许这样:
int a;
int *p = &a; //允许
int *q;
q = &a; //允许
q = p; //允许
=============
第3个回答  2013-10-14
注意,应该是:q=p;
因为int *p;应该看成int* p,是指定义一个指向int* 类型的名字叫做P的数据
q=&p 是错误的,因为q是int* 的指针数据,p也是,这个赋值操作两边类型不一致

int a=p; *q=a;同上,a=p是什么意思,两边类型不一致,p是指针,a是整形数据应该写成int a=*p;

*q=a;改为 q=&a 意思为让q指向a,

我想应该是这样的,不信的话最好是举个例子到编译上试试,建议看本书《c和指针》
第4个回答  2013-10-14
强制转换一下试一试,
例如:*q=p:改成*q=(int)(p);
相似回答