
根据出现的位置不同, *** 作符 * 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值。
&是地址 *** 作符,用来引用一个内存地址。通过在变量名字前使用& *** 作符,我们可以得到该变量的内存地址。
// 声明一个int指针
int*ptr
// 声明一个int值
int val = 1
// 为指针分配一个int值的引用
ptr = &val
// 对指针进行取值,打印存储在指针地址中的内容
int deref = *ptr
printf("%d\n", deref)
第2行,我们通过* *** 作符声明了一个int指针。接着我们声明了一个int变量并赋值为1。然后我们用int变量的地址初始化我们的int指针。接下来对int指针取值,用变量的内存地址初始化int指针。最终,我们打印输出变量值,内容为1。
第6行的&val是一个引用。在val变量声明并初始化内存之后,通过在变量名之前使用地址 *** 作符&我们可以直接引用变量的内存地址。
第8行,我们再一次使用* *** 作符来对该指针取值,可直接获得指针指向的内存地址中的数据。由于指针声明的类型是int,所以取到的值是指针指向的内存地址存储的int值。
说穿了,指针就是地址吧,这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。
我不知道怎么理解你的话。我可以理解几种:1.我有个一个指针,我把值赋值到这个指针指向的内存中去,这个毋庸置疑是可以的。例如:int * a = (int *) malloc (sizeof(int))(*a) = 1没有任何问题。
2.我有一个指针,我要改变这个指针的地址。例如:int * a, b, ca = &ba = &c这个也是可以的。
3.我估计你要问的是这个,int * aa = 2000这里的2000是地址,这么做没有任何问题,因为你可以看的出来他和2的情况是一模一样的,只不过2里面是取c的地址给了a,这里是你自己制定确切的地址给a.但有一点要注意,2000是你给的,不是 *** 作系统给的,没人能够保证2000能够进行地址映射到达一个可用的内存。所以在接下来的 *** 作中,没人能保证对a所指向的内存进行 *** 作能够成功。原因因为,地址印射中会对你的2000印射执行权力检测,这是由 *** 作系统和硬件CPU还有8259A芯片共同完成的,你能不能够通过这个检测到达内存是个问题。
最后给你补充个代码:
int * a
int b = 1
printf("%ld\n", &b)
执行完毕后,你就能看到b的逻辑地址,它被打印出来了。你直接把这个数字给a,你就会发现它们的效果等同于 a = &b
原因:1.编译后,逻辑地址不会被改变,(逻辑地址不是最后的物理地址,但是在进程中它能够决定最终物理地址,所以不会有问题)。2.b的地址肯定是可用的。
至于2楼所谓的核心态问题,这个是可以的,核心态可以到达任何一个地方的内存,因为它能够通过所有的权利检测,具体细节就比较多了,涉及到硬件和 *** 作系统的内容。(没试过,虽然我写过核心态下的程序).
char arr[3]={'a','b','c'}char (*ch)[3]=&arr
for(int i=0i<3i++){
printf("%c ",ch[0][i])
}
不过不建议这样的代码。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)