c语言 &取地址运算符的理解

对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回当时声明p 时开辟的地址;但是根据我对代码的观察,我觉得&运算符不只是返回地址的功能;

例如:

int a = 1;
//假设a的地址是0x7dfe88
int *p = (int *)0x7dfe88;

int num = 1;
int *p1 = #

以上是一段简单的给指针p,p1赋值的代码,0x7dfe88是一段单纯的十六进制地址,但是当地址转指针的时候却必须加上强转(int *);如果不加强转,那么编译器就会提出警告( warning C4047: “初始化”:“int *”与“int”的间接级别不同);但是使用&运算符取地址的时候却不需要加任何强转就能编译通过,说明&运算符绝不是的获取地址那么简单,“=”赋值运算符的运算顺勋是从右向左,说明"="的右边也是一个指针,所以在此假设&运算符会取出num的地址,并且根据num的类型生成一个临时的指针。

根据假设,写出如下代码验证:

int num = 1;
double *p1 = #

结果编译器报“ warning C4133: “初始化”: 从“int *”到“double *”的类型不兼容”错误。所以我的假设有一定的道理。

综上所述:

(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型。(只是本人自己观点)

时间: 2024-10-14 00:37:19

c语言 &取地址运算符的理解的相关文章

关于C语言取地址运算符”&“

关于C语言地址.取地址运算符"&" 2015-04-14  青岛  张俊浩 今天在论坛贴吧看到关于C语言运算符"&"的问题,因为之前自己学C语言时也遇到这个问题,就整理一下思路回帖,也顺便整理成一篇博客~ 问题如下: int a; scanf("%d",&a); 我们老师讲,&是取地址符,但是我就奇怪,为什么叫取地址? 我们明明是想知道a是多少,而不是说它在哪,地址不是形容一个事物在哪吗?我输个10,a就是10了.

终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ---------------------------------------------------------------------------------------------------------------- 在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一

引用与取地址

一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用rf.&(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时                  表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分.其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的

引用和取地址区别

一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用rf.&(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时                  表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分.其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的

[转载]C++中 引用&与取地址&的区别

一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用rf.&(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时                  表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分.其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的

C语言的数组名和对数组名取地址

http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址.现在又这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,既二级指针嘛!当然这样的结论是错误的,不然这篇笔记也就没有意义了. 下面我们来逐步分析,下面是一段验证这个问题的代码 Code: #include<stdio.h> in

C语言函数名以及取地址的区别和联系

有时看到如下的代码: /*****************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> void test() { printf("123456\n"); } int main(int argc, char *argv[]) { printf("0x%x\n",test); printf("0x%x\n&q

C语言中对数组名取地址

在C/C++中,数组名相当于一个指针,指向数组的首地址.这里"相当于"不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一个操作. 如果声明有如下数组: int arr[5]; 那么,&arr这个操作得到了什么值呢? 如果简单的认为arr就是一个指向数组首地址的指针的话,那么很自然会想到&arr得到的是一个指向存放arr这个指针的指针,也就是一个二级指针,然而事实却并不是这样. 观察以下代码:

C语言 对数组名取地址

作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是