C语言指针的一个问题

我想问我这几个值交换的方式有什么错误
请忽略我有个错误,把框里的short 改成char

(1) 第一个框里的代码
short* temp = *p1; 等价于下面的两条语句:
short* temp;
temp = *p1;
所以,后面
*p2=temp;
和上面是一致的, 没错.

(2)第二个框里的代码
没错, 指针就一个该指向指针, 但是你这里赋值一个值.
这种做法是错误的, 不过对C语言来说, "错的"的意思是"不能保证正确", 你是可以"碰巧正确的".
根据(1)理由 *p = *temp 是错的.

或者你也可以认为这里是对的, 而 short* temp才是错的,
反正就是这两个地方不一致.

(3)第三个框里的代码
这个是完全正确的.追问

short* temp = *p1; 等价于下面的两条语句:
short* temp;
temp = *p1
,,

既然temp是指针了,为什么可以直接等于*p1,*p1不是一个值吗?
为什么不是temp=&(*p1)

追答

C语言有的时候可以强制类型转换.
也就是说, 这里你把一个值强转成了一个指针赋给 short* 了,
而后你又把short*强转成值付给 *p2 了.
等效于:
short* temp;
temp = (short*)(*p1);
*p1 = *p2;
*p2 = (char)(temp);

如果是在C++, 这个地方就会是一个错误.

追问

哦,对不起,我只是用short逆置汉字字符用的,忘了改成char..

现在这个short是char,

我大概明白一点了,但是还有个问题是,在这个框定义的临时变量temp指针,可以不用指向地址吗?书本上说指针也是变量,只是指向的是地址

这是我改了下,为什么第一个不对,我想不出原因

追答

都说了, 正确的做法是第三个, 所以即是是把short改成char,
那也应该是
char temp = *p1; // 注意不是 char*
*p1 = *p2;
*p2 = temp;

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-08-07
第一题,第二题:
temp是个指针,temp=*p1之后,temp=61(即'a')了。而*temp表明temp指向的地址上面的值(即地址61上面的值,而实际上61是个数值,不是地址)
第三题:
这个是正确处理方法。你需要交换的是个整数,不是地址,所以定义temp时定义为整数类型
第2个回答  2015-08-07
short *temp=*p1;是把‘a’赋值给了temp,而不是把地址赋值给temp。追问

这样处理有两个疑问:
temp是指针呀,指针该指向地址的嘛,可是这里直接就是一个值,如果我写成这样:
char *temp = p1;
*p1 = *p2;
*p2 = *temp;
我的想法是把第一个字符的地址,现在就是p1等于temp,然后交换p1和p2的值,这样的处理可是还是错误的!

追答

你写为
char temp;
temp=*p1;
*p1=*p2;
*p2=temp;
再试试看。

C语言指针的一个问题
(1) 第一个框里的代码 short* temp = *p1; 等价于下面的两条语句:short* temp;temp = *p1;所以,后面 p2=temp;和上面是一致的, 没错.(2)第二个框里的代码 没错, 指针就一个该指向指针, 但是你这里赋值一个值.这种做法是错误的, 不过对C语言来说, "错的"的意思是"不能保证正确", ...

关于C语言结构体指针的一个疑问?
出现此问题的原因在于链表创建create函数有问题,问题定位在图中红色框内。此处每个节点使用的是局部变量,函数结束后,局部堆栈虽然内容不会清除,但内存会被回收,如果其它地方也使用堆栈可能会分给它用,内存内容就会改变。正确的方式是申请堆内存。使用malloc函数,同时包含头文件#include<stdlib.h>。框内...

关于C语言指针的一个问题?
图中1处指针p没有初始化,它没有指向任何内存单元不能进行图中2处的赋值写入操作,这里会程序崩溃退出。

C语言指针问题。
这是一个运算顺序的问题。注意括号的运用。(1) ++(*pointer)是先取值,再自增,当前pointer指向的是位置arr[3],取值后是2,*pointer的结果是2,2再自增,当然会得出3。值得说明的是,这个括号是可以省略的,此处括号只起到增加程序可读性的作用。(2)*(pointer-2)是先移动指针,再取值。p...

c语言指针问题,求解答
D 定义指向函数的指针pf,函数参数为int,char型(不符题意,题目为int,char*),无返回值 B、D的定义为:定义函数pf,函数参数为空,返回类型为void *(void 型指针)单从函数指针的定义可排除BCD。其次,指针赋值 函数名与数组名性质类似:数组名为数组内第一个数据的地址,即a[10],则a==&a[...

C语言关于指针的一题。
{ int a[]={2,4,6},*prt=&a[0],x=8,y,z; \/*定义整形数组a,把2、4、6依次存入数组a的前三个地址 中,定义一个整形指针prt,并把数组a中首地址的值赋值给 prt指向的地址中*\/ for(y=0;y<3;y++)z=(*(prt+y)<x)?*(prt+y):x; \/\/把prt指向的值与x进行比较,把小的...

C语言指针问题
一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...

一个C语言指针问题。求大佬解答?
在这个程序中,我们首先提示用户输入方阵的尺寸,然后输入方阵的元素。接着,我们通过遍历方阵的每一行,并使用指针指向每行对应列的元素,来求出方阵对角线元素之和。最后,我们输出结果。程序的输出示例如下:include <stdio.h> int main(){ \/\/ 方阵的尺寸 int n;printf("Enter the size of the ...

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

c语言,指针指向另一个指针的问题,为什么报错?
图中红色框内代码有误,*(p+5)不是表示指针而是值。应改为 q = p+5 另外补充说明,改成这样虽然没有语法错误,但是很明显p+5已经超过数组a的内存空间,需要注意。

相似回答