c语言 求教高手帮忙解答 关于指针

作者&投稿:玉飘 (若有异议请与网页底部的电邮联系)
关于C语言指针的问题,希望高手帮忙解答一下~

你要明白,指针变量有两个相关的值,一个是指针变量本身的内存地址,一个是该内存地址存储的数据,是另一个变量的地址。
如:
int *p;//定义一个指针变量,既然是变量,它本身就有地址,还没赋值,它里面的数据不确定。
所以*p=5;是错误的,还没初始化,指向的内存地址不确定,要把5存储到哪里的内存?
指针变量名p表示的是它的值,等于另一个变量的地址。

int a;
p=&a;//将a变量的地址存储在 p变量所在的内存空间。
char *pname[]={"wang","li","zhang","jin","xian"}; 这里定义的是一个指针数组,数组的元素是一个个字符串的地址,假设是{0xaa,0xbb,0xcc,0xdd}
将数组首地址作为实参传递给形参
在调用函数里面,因为是地址传递,所以可以改变数组元素的顺序,如假设变为{0xbb,0xcc,0xaa,0xdd}
形参改变不会影响实参的值没错,pname本身的值也的确没变,但是数组元素的顺序改变了,指向的字符串当然也不同了。
如果还是不懂就画个草图,关键是 时刻把数据在内存中的存储放在心上。

&a+1是将数组a的首地址加上整个数组的长度,所以*p1是一个野值
(int *)((int)a+1)是将数组a的首地址转换为整数然后加1,所以p2指向的是数组a的首地址后一个字节的地方。*p2的值取决于你的系统的字节序,如果你的系统是windows,则*p2=0x02000000

//此函数功能为找字符串中最大的字符,
//将最大字符的前面的字符均向后移动1位,
//将最大的字符放在字符串首
#include<stdio.h>
main()
{
char str[80],*p,max,*q;
p=str;//将指针指向数组首地址
gets(p);//从标准输入读取字符串
q=p;//最大的字符所在的位置
max=*(p++);//将第一个字符当成最大值

while(*p!='\0')
{//找最大的字符
if(max<*p)
{
max=*p;//将最大的字符赋值给max
q=p;//将最大字符的地址赋值给q
}
p++;
}
p=q;//将最大字符的地址赋值给p
while(p>str)
{//将最大字符前的字符均往后移动1位
*p=*(p-1);
p--;
}
*p=max;//将第一个字符赋值为最大的字符
puts(p);//打印字符串到屏幕
}

程序有个bug,当你的字符串第一个字符就是最大字符的时候,程序会出错。原因在q上,如果第一个字符就是最大的,那么{max=*p;q=p;}这句就永远不会执行,那么q就是一个不确定的值。最后再执行p = q,就有错了。修改办法:在gets(p)后面加上q = p。第一个while中,p用于遍历,max记录最大值,q记录最大值的那个位置。第二个while中,从q地址向str地址遍历,依次移动值,while中比较的是当前p指针所指值的地址和字符串的初地址(因为数组的地址是连续的,所以这样来比较循环没有问题)。

while(*p!='\0')//最外层while保证不会检索到字符串外面去
{ if(max<*p) {max=*p;q=p;}//找最大那个的位置
p++;
}
p=q;
while(p>str){*p=*(p-1);p--;}
*p=max;
puts(p);
}

复制后,没错??
运行也没错??
你是逻辑错误??
那你想程序是怎么样的??才可以帮你...


清涧县18699001351: C语言中的指针请教 -
笪福芪蓉: 1.对于这个问题,我给你举个实例吧.一般旅店呢有很多房间,店主一般会在分别编号,这个编号就是各个门的地址了,我们再把各个号码贴在钥匙上,通过钥匙就可以访问各个房间了,而钥匙这个时候就相当于访问的指针了,他上面的门牌号...

清涧县18699001351: 请问C语言中 指针是什么?有什么作用?请用通俗的语言解释 -
笪福芪蓉: 通俗的说,就是你家的门牌号, 简单地说指针就是指向变量和对象的地址. 指针的用途非常广泛,比如如果你想通过函数改变一个变量的值,就得用指针而不能用值传递.还有在很多时候变量,特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行,大大提高了效率. 以上还只是指针的初步应用,随着你在C语言学习上的逐步深入,你会发现更多的用途的

清涧县18699001351: c语言指针 -
笪福芪蓉: 首先,*和&一定是作用于指针类型,所以首先保证你的p一定是一个指针类型. *操作符返回某个指针所指的类型的值 &操作符返回某个类型变量的存储地址 下面来看:假如有一个整型变量i,它的值是100,存储在地址0x000000F0上(不要在意地址的合理性,仅是假设),p是指向i的一个整型指针(即int *p = &i),p存储在地址0x000000F4上.下面: *p 表示p所指整型的值,即i的值,10 &p表示整型指针p的存储地址,即0x000000F4 *&p表示存储在0x000000F4上的整型指针变量的值,即指针p的值,即0x000000F0(变量i的地址) 所以你的答案应该是:p与*&p一样,而*p与i一样

清涧县18699001351: C语言中关于指针问题 -
笪福芪蓉: 我刚刚在VS2010里试了一下, B和C都是错的.计算机题目应该都是单选的, 所以有可能是你有一点的笔误, B如果是(*w+1)[4]就正确了.首先我给你一个最简单的我自己总结的方法吧, 要想从数组或者指针中取数据的话, 要满足这个公式(...

清涧县18699001351: c语言,关于指针 -
笪福芪蓉: 把t=*s1++;*s1=*s2--;*s2=t;分开写成 t=*s1; s1++; *s1=*s2; s2--; *s2=t; 根据s1<s2的条件,上面代码要执行3次:第一次结果是1734517,第二次是1714717,第三次是1711717.手工把上面代码执行一下就看清楚了.

清涧县18699001351: c语言关于指针运算 -
笪福芪蓉: 在C语言中这段程序非法,C中不存在int& b这样的引用 在C++中结果为121

清涧县18699001351: C语言中关于指针的指针问题? -
笪福芪蓉: 指针变量存的是地址,地址中的内容是数据 二维指针变量存的也是地址,只是址中的内容还是地址 如:int i ; int *p; int **pp; i=0; //i变量中存的是数据10,i是个变量名 p=&i; //p变量中存的是i的地址 *p==i==5 pp=&p ; //pp中存的是p变量的地址 *pp==p==&i **pp==i==5

清涧县18699001351: c语言 求教高手帮忙解答 关于指针 -
笪福芪蓉: //此函数功能为找字符串中最大的字符,//将最大字符的前面的字符均向后移动1位,//将最大的字符放在字符串首#include<stdio.h> main() { char str[80],*p,max,*q; p=str;//将指针指向数组首地址 gets(p);//从标准输入读取字符串 q=p;//最大的字符所...

清涧县18699001351: C语言 指针问题求解!高手来吧 -
笪福芪蓉: for(it1 = p; it1 < (p + n); it1++)//相当于for(i=0;i<n;i++) 循环内用p[i]访问//但p[i]使用时需要通过计算地址 p的首地址+i*8/*double的大小 8*/ 来访问//循环次数多的话也耗费时间//所以直接对要访问的地址做递增//应为p是数组首地址 不止1个地方用 就再定义了一个 //建议p+n也用单个变量保存 double *const cpend=p+n;

清涧县18699001351: C语言中有关指针的问题 -
笪福芪蓉: 首先指针本身也是一个变量,它也有自己的地址.而作为一个变量它又可以用来存放数据.那么对于对于如下的示例:int x = 10; int *p = &x; int *q = NULL; 假设x的地址为22ff74, p的地址为22ff70,则p == 22ff74, *p = 10; 如果执行语句q = p;那么q = 22ff74, *q = 10 如果执行语句*q = *p;那么*q = 10,而q的地址将保持它原来的地址不变.在你的问题中:p = pr;表示p指向了pr指向的地址空间.*p = *pr表示p指向的结构体中的值等于pr指向的结构体中的值.此时p和pr的指向均没有发生改变.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网