C语言指针引用取值

C语言指针引用取值,第1张

指针是一个存储计算机内存地址的变量。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。

根据出现的位置不同, *** 作符  *  既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值。

&是地址 *** 作符,用来引用一个内存地址。通过在变量名字前使用& *** 作符,我们可以得到该变量的内存地址。

// 声明一个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])

}

不过不建议这样的代码。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7593045.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-07
下一篇2023-04-07

发表评论

登录后才能评论

评论列表(0条)

    保存