2 zxf19902519 ZXF19902519 于 2013.12.02 21:22 提问

多级指针的强转输出结果为什么不通?

enter code here

## 1#include
2 void funb(int**x)
3 {
4 int**p=x;
5 **p=300;
6 }
7 void funa(int* x)
8 {
9 int*i=(int*)x;
10 *i=200;
11 funb(&i);
12 }
13 int main()
14 {
15 int i=100;
16 funa(&i);
17 printf("%d\n",i);
18 return 0;

19 }

#include
2 void funb(int**x)
3 {
4 int*p=(int*)x;// 为什么强转之后输出的是200而不是300?
5 p=300;
6 }
7 void funa(int
x)
8 {
9 int*i=x;
10 *i=200;
11 funb(&i);
12 }
13 int main()
14 {
15 int i=100;
16 funa(&i);
17 printf("%d\n",i);
18 return 0;
19 }

2个回答

u012813250
u012813250   2013.12.02 23:56
已采纳

void funa(int x)这应该是你的偶然失误,应该是 void funa(int *x)。

主要问题是:
void funb(int**x)
3 {
4 int*p=(int*)x;// 你在传参的时候传进来的是一个int型指针的地址,它的本质是指向int型数据的 指针的地址,即使强转了类型,这个本质不会变,想要访问到最初的int型数据还是要解两次星号才行。但是因为你定的p是一位指针无法解两次星号,所以无法直接解两次星号改值,还要再强转一次。即先把p转成二维指针(int**)p,再解双星**(int**)p 如下:
5 (int)p=300;
6 }
这样才行。因为p的本质(也就是p对应的内存中存的数据)是最初int型数据的地址的地址。

使用指针时主要是理解变量内存中究竟存的是什么,而不是去一味关注数据的类型。
个人意见,希望对你有帮助。如有错误还望指正。

ZXF19902519
ZXF19902519 是的我的“*”也是因为浏览器原因一上传就没了
4 年多之前 回复
u012813250
u012813250 代码里的**(int**)p在我的浏览器里显示的好像不太对,所以解释得比较多。见谅。
4 年多之前 回复
chenglechao
chenglechao   2013.12.03 10:09

楼上说的不对,你的 void funa(int x)的函数传入的形参在函数调用完之后就释放了,这是第一个问题,可以改成void funa(int &x)试试。
其次,你的函数 void funb(int **x)写的有点问题,P是直接这样赋值会出问题

u012813250
u012813250 我的意思是void funa(int x)这句应该是他的打字失误,因为上面他写得是void funa(int *x),是没有错的。并不是说我认为void funa(int x)是对的。而且提问者的主要问题不在这里。不过我的确 说的不够清楚,下次注意。
4 年多之前 回复
ZXF19902519
ZXF19902519 浏览器有问题,录代码时void funa(int x)这是指针参数,但是显示不出来“*”,不知道是什么原因
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言--多级指针和指针类型强制转换
#include //多级指针 int main(int argc, const char *argv[]) { int a = 12; int *p = &a; //p=&a=*w int **w = &p; printf("a = %d\n",a); printf("*p = %d\n",*p); printf("**w = %d\n",**w); return 0;
char *强转为int*后会怎么样?
先把代码粘上来吧:*——* int _tmain(int argc, _TCHAR* argv[]){ char a[10]; a[0] = 0xFF; a[1] = 0x00; a[2] = 0x00; a[3] = 0x00; char *pa = a; int *pi = (int *)pa; int
0强转为指针的用处
ANSI C 标准允许任何值为0的常量被强制转换为任何类型的NULL指针      因此(type*)0  是一个类型为type类型的一个空指针  但是它不能被赋值  只能被用作本类型的地址来使用    eg:  struct student                  {                     int id;                     char
C---int和指针转换注意事项
这个标题也许写的有点不知所以然了,其实博主今天要讨论的自己在复习c/c++指针和引用的时候遇到的一些问题,慢慢说来….. 开始的时候写了这么一段代码: int a = 1; int* p = &a; printf("指针变量p的值 p - 16表示 是 = %p \n",p); printf("a的地址 p - 16表示 是 = %p \n",&a); /*输出 指针变量p
14、OC 指针变量的强制类型转换
指针变量的强制类型转化同基本数据类型的强制类型转化相同,都是使用类型转化符圆括号。 强制类型转换只改变编译时类型,但该变量所指的对象的实际类型并不会发生改变,所以强制类型转换时可能会出错。 int main(int argc, const char * argv[]) { @autoreleasepool { NSObject* obj = @"hello";
C++结构类型在GDB中的强制类型转换(带namespace的强制转型要加单引号的)
今天在调试程序的过程中遇到的一个小问题,在这里记录一下,希望能对遇到同样问题的朋友有所帮助。 以下面的程序为例程进行说明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 4
将指针强制类型转换为函数指针
尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数地址的方法是:用不带有括号和参数的函数名得到。 函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。 那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。 强制类型转换的方法如下所示:(参考自http://blog.ch
结构体类型的指针的强制转换
结构体和int等类型一样,都是数据类型。其他类型怎么转换,结构体就怎么转换,没有什么特殊的地方。 楼主可能想知道的不是结构体怎样强制转换这个问题吧,猜测,楼主想知道如下几个问题: 如果将一个结构体强制类型转换为另一个结构体(或者类型),那这个结构体的成员会怎样了? 如果将一个结构体强制类型转换为另一个结构体(或者类型),那么这个结构体成员的数值又会是什么了? 解答: 1、结构体的本质是:
万恶的void*指针类型转换
大家都知道:用一个基类的指针指向一个派生类的对象是合理的,然而很多人却忽略了这样做的大前提:必须使用规范的指针转换过程。 最近要添加一个功能,上层代码为此新增了一个虚函数接口。我一看,此虚函数所在的类也是新增的,底层驱动代码以前没有使用过这个类。 class IDmIAL_VER5 { public:     virtual WORD IAL_SetRldRamCondition
数组指针、指针数组、地址的强制转换内存布局
1、指针数组 首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 2、数组指针 首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。