一道与c语言指针有关的题

来自:    更新日期:早些时候
C语言关于指针的一道题~

同学你好!
你的问题出在这里:
void rev(int *p,int n) //交换数组中相应位置的数
{
int i,ex;
for(i=0;i<=(n/2);i++)
{
ex=*(p+i);
*(p+i)=*(p+n-i-1);/*注意这里哦!!!*/
*(p+n-i-1)=ex;/*还有这里*/
}
}

这里你是要用第一个数据和最后一个交换,但是按你的写法,却超出了你数组的规定的范围,自然会出错!

希望我的回答对你有帮助,祝你的成绩进步!

数三个赋值为零;数到最后回到开头;重新数;遇到零就跳过;到最后只剩一个人;while结束;
p是一个指针;指向一个地址;*p是该地址上存储的值;这里要的是地址值加1;也就是指向下一个;地址;
为了便于你的理解;等价程序如下:
# include # define N 50int main (){int i,j=0,k=0,n,*p,a[N];printf("请输入人数n:");scanf("%d",&n);p=a;for(i=0;i<n;i++) {a[i]=i+1;//*(p+i)=i+1;}i=0;while(j<n-1){if(a[i]!=0) k++;//if(*(p+i)!=0) k++;if(k==3){a[i]=0;//*(p+i)=0;k=0;j++;}i++;if(i==n) i=0; //这里不明白,为什么要令i=0?但是当我把这里去掉之后又为什么没有输出?}while(a[i]==0)//while(*p==0)i++;//p++; //这里不明白,为什么是p++而不是*p++?printf("最后剩下的号数为:%d
", a[i]/*p*/ );return 0;}

printf("%s\n", p-3); //通过上面的分析,不难算出,p-3就是字符'6'的地址,这个语句就是输出从字符6开始的字符串,因此是6789。字符'9'后面是结束符'\0'。

i = 8;p =a +i 所以 p现在指 9处

然后-3 向后倒3 6处

打印的是%s 所以从6处开始输出

首先,你的p=a+i,那此时,p所指向的地址就是指向数组a中字符9的位置,但是输出的时候p-3,使得p的地址又向前移动了三个,就指向了a数组中字符6的位置了
并且,你输出的是%s,是字符串,那么他的值就向后一直输出,直到遇到‘\0’结束,也就是9的后面,所以输出的是6789

p=9是怎么得出来的啊,谢谢
不是p=9,因为i的初值为8,p是指针,如果直接写a,那么那个地址指向的就是a数组的第一个元素的地方,也就是括号里1的位置,你向后数八个数,也就到了9那个位置了


一道与c语言指针有关的题视频

相关评论:
  • 15512889959有一个关于c语言指针的题,求详解,具体见内容
    宦疫宁答案是D 在循环开始,ptr指向了数组的首地址,经过一次循环,指针指向了下一个字节。第一次循环 ptr指向该数组第一个字节,通过printf函数,输出了指针所指的字符串“ABCDE”一次循环,每次指针后移一个字节。然后输出该字符串。参考资料:p

  • 15512889959问两道有关c语言字符指针的问题,请将程序每一步的意思告诉我,谢谢啦...
    宦疫宁第一题答案:B。理由:*s与*t都是取出此时地址存储的值,while()语句里面的意思是,当指针s与t都不为空并且s指向的值等于t指向的值。。。当s或者t为空或者t与s指向的值不同时,while()结束,返回此时s指向的值减去t指向的值,所以为比较两个字符串的大小;第二题答案:A。理由:x的地址赋值...

  • 15512889959c语言这几道题 关于指针的 望大神解答
    宦疫宁1、D选项,*x本身就错误,因为x是int类型,没法使用*操作符。2、A之所以错是因为代码中有一句q=NULL,也就是说q是一个空指针了,你再向里面写东西就错了,而且你在vc6.0中可以试一下,马上会出现一条0xc000 0005的写异常。。3、是的,你不管给它赋值多少都是4的。。就好比一个4平方米的房子...

  • 15512889959c语言选择题(指针)
    宦疫宁答案是A,首先定义p是一个指向int类型的指针,不过这个指针没有初始化,也就是没有指向。然后定义了一个int类型的变量i,这里千万不要认为i也是个指针,如果i跟p一样,要在前面也加个*号。然后分析答案: A,这里对p指向的变量进行赋值,这里是相当于初始化了。所以正确。B,不正确\/不合理,因为p的...

  • 15512889959一道与c语言指针有关的题
    宦疫宁printf("%s\\n", p-3); \/\/通过上面的分析,不难算出,p-3就是字符'6'的地址,这个语句就是输出从字符6开始的字符串,因此是6789。字符'9'后面是结束符'\\0'。

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

  • 15512889959C语言指针问题。
    宦疫宁(1) ++(*pointer)是先取值,再自增,当前pointer指向的是位置arr[3],取值后是2,*pointer的结果是2,2再自增,当然会得出3。值得说明的是,这个括号是可以省略的,此处括号只起到增加程序可读性的作用。(2)*(pointer-2)是先移动指针,再取值。pointer-2是把指针从当前位置arr[3]回退两...

  • 15512889959C语言指针问题
    宦疫宁一、如有定义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是二维字符...

  • 15512889959C语言指针2到简单的选择题,来个大神解释一下,谢啦
    宦疫宁2 选D y=(*++p)++;等价于 ++p;指针加1,就是指向第二个元素即3 y=(*p)++;由于是后自增,所以等价于y=*p;(p)++;即y等于3 3选D void (char s1,char s2){ while(*s2++==*s1++);\/\/ 写错了,应该是一个等于号 } 将s1每个元素赋值个s2的每个元素,也即相当于拷贝的功能 ...

  • 15512889959c语言习题求解 已知指针p的指向如图所示,则执行*p++;后*p的值是
    宦疫宁*p++,首先要知道*和++的优先级相同,自右向左结合。 则相当于*(p++),但是p++的含义是先用后加。所以先用,就是*p这个操作,后加也就是执行p++。所以*p++就等价于:{*p;p++}所以当前*p的值就是20,然后p++(该p是指针不是*p所说的指针指向的值)指针后移指向a[3]位置。此时,*p为30. 本回答由网友推荐...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网