这个题相当有趣。而且,几乎没有资料仔细的解释过这个问题。
正确的符合标准C++的输出结果确实清败蠢应该是4 。
分析一下你的 *** 作:
你取他的地址,你确实取到了,这是真的。
你利用这个地址修改其中的值,你也确实修改了那个地址的值,那个地址位置的内存中所保存的确实是你修改后的值8,这也是真的:原来恒量p所答陪在的地址中的值现在是8。
为什么输出是4的原因,其实打印语句根本没有跑去内存里面读那个地址的值,而是直接把一个常量‘4’扔给cout了。这是编译器做的手脚。目枯宽的是为了符合C++标准:恒量不许被修改,即便是利用一个可以进行修改的指针指向这个恒量(标准规定这个指针可以被当作指向了这个恒量,但不必真的指向他,而且不可以通过这个指针修改恒量内容)。
举个例子说明一下编译器的行为方式:
const int i=10
b(i)
会被编译器当成
const int i=10
b(10)
来处理。
所以你无论把i所在的内存改成什么都无所谓,反正b收到的参数都是10.
实际上这个语法在C++里面可以当做替代预处理器的#define语句,而编译器处理他们的方式也基本是这个样子,就是扔个常量给他,不去读他们所在的内存。不变是const存在的意义,正因为有这个保证才能执行这样的 *** 作:
const int a=10
int b[a]
首先,int *num[] 是指针数组 ,存放的是数组元素a[0]-a[5]的地址。再说sort 参数,传入的是数组num的首地址 ,以及 n 要排序的元素个数。
if(*num[k]>*num[j])里 ,num[i]为对应数组元素a[i]的地址,显然*num是取a[i]的值,也就是说
*num[k]等同于a[k],不同的是,如果你传入的形式是a[i],只是单纯的形参,变量存放在堆栈中,单纯的交换了变量的值,当函数运行结束后,会释放掉堆栈,这些变量值也就被释放掉,所以实际a中内容也没有改变。如果传入的是地址,同样指针也是4字节的形式(32cpu int 地址32位,64位cpu指针就是64位的地址)存放在堆栈,但下面的交换代码里是对这些地址所在位置的值 ,即储存a的内存元素进行交换,这就是你说的a内容里面的值也被交换了,当函数运行结束后,堆栈也被释放,指针也就不存在了。但a的作用域在该函数外,即使该函数结束,也没有权利释放掉a所在内存,所以a的值被交换,就是永远的被交换了。你调用sort(&a)明显也是对地址进行 *** 作的,也是会改变a里面的值。至于形参和实参的问题,形参永远不会影响实参的,即使形参与实参的名字相同,也不会分配到内存同一个地址,函数结束形参就随着栈的销毁而销毁,会对实参造成影响是因为是直接对某个内存地址就行了 *** 作,直接修改了某个内存地址的值。
如果以上看不懂,那么你要好好的看下数据结构 ,做为程序员,正真要弄懂指针,必须也要明白内存中是怎么存放的。虽然 *** 作系统的mmc内存管理使编程员很少直接对内存去 *** 作,而高级语言变量在内存的存放又被编译器做了,但有些东西不知道,你就无法理解,更别谈编程了。
何况现在很少的学校有开设数据结构这门课。。我也很纳闷,数据结构和算法导论都不学的,何谈编程,何谈程序员。。。。。。
对c指针的讲解,建议你看下c和指针 ,还是不错的一本书,前面都是基础,可以忽略,后面涉及指正的部分还是很精华的。
至于第2个问题:这是数组指针里面的东西了,想要弄懂就去看我说的那本书吧。我简单说下:
int a[10];
int *p
p=a 这你应该懂 ,就是普通的指针。*p就是 a 数卜盯组的首地址a[0]。*(p+1)就是a[1]
*p[10],可以理解为数组p[10],每个元素均为指针,即这个数组存放的元素也均为指针 ,
这里有10个数组a[10],b[10],c[10].....
p[0]=a,
p[1]=b,
............
p[9]=c,依次元素p[0]-p[9]均为指针 分别指向10个数组,即a,b,c.......
因此 *p 代表p数组的p[0]元素,不懂参考上面的普通指针
*(p+1)代表p[1]元素,*(p+2) 就是p[2].
但这只是寻址p 怎么寻址a呢
p[0]就是a p[1]就是b ......
所以 *p 是a 那么**p就是 *(p[0]) 就代表 a[0] *(*p+1) 就是 *(p[0]+1)代表a[1]
*(p+1)是b 那么**(p+1)就是*(p[1]) 是b[0]*(*(p+1)+1) 就是*(*p[1]+1))就是b[1]
这里懂了 那么上面你的问题就很简单了
但是不幸的是,这只是一维数组指针。。。。指针还涉及到 函数指针,多维数组的指针,等等,灵活运用蠢弊乎指针可以很容易的设计程序结构,使得代码也更紧凑,所以说指针是c的精华,想要弄懂确实不易,但真正明白本质,“指针即地址”这句话,你再回头看这些,其实也不难,而且很简单。
总之就是多看代码,多写代码带悉 ,多看书,祝君好运!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)