精华内容
下载资源
问答
  • C语言基础之取地址运算

    千次阅读 2020-06-08 14:58:49
    考虑以下程序段 #define _CRT_SECURE_NO_WARNINGS #include int main... 对于“&”符号,其右侧必须为一个明确的变量,否则就不能取地址进行运算,反例如下: &(a + b); &(a++); &(++a); 以上代码,IDE中编译无法通过。

        考虑以下程序段

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main()
    {
    	int i = 0;
    	int p;
    	p = (int)&i;
    	printf("p = 0x%X\n", p);
    	printf("&i = 0x%p\n", &i);
    	return 0;
    }

        在x86和x64的编译器下,其结果并不相同:

    x86架构下的结果
    x64架构下的结果

    这说明,在两种不同的架构中,地址的大小并不相同,可以采用如下程序段进行检验:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main()
    {
    	int i = 0;
    	int p;
    	p = (int)&i;
    	printf("sizeof p is %d\n", sizeof(int));
    	printf("sizeof &i is %d\n", sizeof(&i));
    	return 0;
    }
    x86架构下的结果
    x64架构下的结果

        以上的实验代码说明,int与int*类型的大小是否相等,取决于具体的编译器/架构。所以在希望打印地址时,要使用%p进行输出,而不是使用int型变量进行赋值再输出,即地址并不永远等于整数,这一点是值得注意的。

        对于“&”符号,其右侧必须为一个明确的变量,否则就不能取地址进行运算,反例如下:

    &(a + b);
    &(a++);
    &(++a);

        以上代码,IDE中编译无法通过。

    展开全文
  • 指针(取地址运算)

    千次阅读 2018-12-09 19:13:02
    地址的大小是否与int相同决于编译器。 printf ( "%p" , & i ) ; &只能明确变量的地址 &(i++) &(a+b)都是不对的 试试这些& 变量的地址 相邻变量的地址 为什么这样写就是相邻的两个变量,i,p...

    sizeof
    是一个运算符,给出某个类型或变量在内存中占据的字节数。
    sizeof(int)
    sizeof(i)

    #include<stdio.h>
     int main()
     {
     int a;
     a=6;
     printf("sizeof(int)=%ld\n",sizeof(int));
     printf("sizeof(a)=%ld\n",sizeof(a));
     return 0;
     }
    

    4 4

    scanf("%d",&i);

    运算符&

    获得变量的地址,它的操作数必须是变量。
    地址的大小是否与int相同取决于编译器。

    printf("%p",&i);

    &只能取明确变量的地址
    &(i++)
    &(a+b)都是不对的

    试试这些&
    变量的地址
    相邻变量的地址

    • 为什么这样写就是相邻的两个变量,i,p一定相邻吗?还有视频中提到的堆栈
    printf("%p",&a);
    printf("%p",a);
    printf("%p",&a[0]);
    • 这三行代码的结果是相同的,why?
    展开全文
  • &不能对没有地址的东西取地址: &(a+b)?✖ &(a++)?✖ &(++a)?✖ 在&右边必须有一个明确的变量,才能去取它的地址。 3.为什么变量会有地址?因为c语言的变量是放在内存里面的,每一个变量...

    一、运算符sizeof()

    c语言给出了一个工具,有一个运算符叫做sizeof(),这个sizeof()可以给出某个类型或变量在内存中所占据的字节数。比如说sizeof(int )告诉你int占据了几个字节;sizeof(a),会告诉你a这个变量了占据几个字节。
    我们来试一下sizeof这个事情:

    #include<stdio.h>
    int main()
    {
    	int a;
    	a=6;
    	printf("sizeof(int)=%d\n",sizeof(int));
    	printf("sizeof(a)=%d\n",sizeof(a));	
    	printf("sizeof(double)=%d\n",sizeof(double));	
    	return 0;
     } 
    

    运行结果为:
    在这里插入图片描述
    拿int来分析运行结果:int在内存中占据了4个byte(字节),1个byte=8个bit(位),所以4个byte意味着这是一个32位的变量,这个变量在内存中要占据4个byte,或者说占据32个bit。

    二、运算符&
    1.scanf函数里一定要有&符号,如果变量前面不加&符号,程序就会出错。

    2.&不能取的地址
    scanf(“%d”,&i);里的&,作用是获得变量的地址,它的操作数必须是变量。
    &不能对没有地址的东西取地址:

    • &(a+b)?✖
    • &(a++)?✖
    • &(++a)?✖
    • 在&右边必须有一个明确的变量,才能去取它的地址。

    3.为什么变量会有地址?因为c语言的变量是放在内存里面的,每一个变量(上面用sizeof()看过都有相应占据的字节,这些字节在内存中占据一定的地方,它放在某一个地方,它就有一个地址。所以运算符&就是把那个变量的地址拿出来告诉你。

    4.那么这个地址会是怎样一个值呢?
    我们在64位架构下运行以下代码:

    #include<stdio.h>
    int main()
    {
    	int i=0;
    	int p;
    	p=(int)&i;
    	printf("0x%x\n",&i);
    	printf("%p\n",&i);	
    	printf("0x%x\n",p);	
    	printf("%lu\n",sizeof(int));
    	printf("%lu\n",sizeof(&i));	
    	return 0;
     } 
    

    程序运行会出现warning,[Warning] cast from pointer to integer of different size [-Wpointer-to-int-cast]。
    我们先不管这个warning,运行结果如下:
    在这里插入图片描述
    可以看到在64位架构下int是4个字节,而变量i是8个字节。这里说明一下在32位架构上运行以上代码,输出的int和i都会是4个字节。
    总结:运算符&可以为我们取出一个变量的地址,但是这个地址的大小、地址的数据类型和int类型是否相等取决于编译器,取决于是64位架构还是32位架构。所以当我们要让printf为我们输出一个地址时,我们需要用%p,而不是真的直接把它当做一个整数。地址和整数并不永远是相同的,这和架构是有关的。

    5.再来对&做一些深入研究
    (1):取相邻的变量的地址

    #include<stdio.h>
    int main()
    {
    	int i=0;
    	int p;
    	printf("%p\n",&i);
    	printf("%p\n",&p);	
    	return 0;
     } 
    

    设置两个变量i和p,程序运行结果:
    在这里插入图片描述
    可以看到在16进制下,一个变量的地址是4C,另外一个是48,C相当于16进制的12,两者相差4。这就说明在内存中,这两个变量是紧挨着放的:
    在这里插入图片描述
    i是先定义的变量,p是后定义的变量。在内存中i在更高的地方,p在更低的地方。这个问题在c语言的内存模型中会讲到。这两个变量都是本地变量,它们分配在内存的一种叫做堆栈(stack)的地方,在堆栈里面,分配内存是自顶向下来分配的。
    (2):数组的地址、数组单元的地址、相邻的数组单元的地址:
    定义一个int数组,尝试如下输出:

    #include<stdio.h>
    int main()
    {
    	int a[10];
    	printf("%p\n",&a);//取出a的地址 
    	printf("%p\n",a);//把a当做一个地址尝试输出 
    	printf("%p\n",&a[0]);//取出a[0]的地址 
    	printf("%p\n",&a[1]);//取出a[1]的地址 
    	return 0;
     } 
    

    结果如下:
    在这里插入图片描述
    分析运行结果,可以发现:
    &a等于a等于a[0];相邻的int数组单元的地址差距永远是4。

    展开全文
  • 关于引用及取地址&运算符的用法

    千次阅读 2018-08-16 14:18:15
    在习惯了C语言的程序员... 在这里我就不介绍位与运算了 , 我先介绍一下取地址运算 ,在学习指针的时候我们就已经用过了取地址符了 , 使用方法为在变量前面加上&amp;即可。 int i = 0 , *pi = &amp;i; ...

           在习惯了C语言的程序员眼里 , & 这个符号的意思就是取地址和对位进行与运算 , 但在C++中 , & 被重载多了一种意思 , 就是引用。 

           在这里我就不介绍位与运算了 , 我先介绍一下取地址运算  ,在学习指针的时候我们就已经用过了取地址符了 , 使用方法为在变量前面加上&即可。

    int i = 0 , *pi = &i;    //指针pi获得了i的地址
    int ** p_pi = &pi;       //指针p_pi获得了pi的地址
    cout << &i << endl 
    << &pi << endl << &p_pi;    //可以输出地址

            接下来是介绍引用 , 简单来说 , 引用就是被引变量的另一个名字 , 当改变引用值时 , 被引值也会改变 , 因为它们两就是同一个值 , 另外 , 引用不能脱离对象单独存在 , 引用是依附与对象存在的 , 因为引用在定义后可能被使用 , 所以引用不能是无对象的 , 所以引用在定义时必须初始化。

    int i = 0 , &ri = i; //定义并初始化一个引用
    ri++; //使i的值变为1
    //int &ri2; 这里是非法的 , 因为定义了引用ri2却没有初始化它 , 在这行代码和下一行之间可能使用无对象的引用
    //ri2 = i;
    //int &ri3 = 10;
    //错误 , 引用必须有对象 , 常量没有对象

           因为引用是变量的别名 , 所以不能将某一种类型的引用绑定到另一种类型的对象上 , 比如不能将char & 赋予int型的变量。但同类型间的引用可以切换绑定 。

    int i = 0 , j = 0;
    //char &rc = i; 非法 , 因为不能用不同类型去引用
    int & ri = i; //合法 , ri是i的引用
    ri = j; //合法 , ri是j的引用

           接下来讲一下怎么区别引用和取地址 , 可以这样说 , 引用中的&只会出现在定义中 , 在变量类型(类)名后面(与指针相似) , 并且在接下来的代码中 , &符号都不会再出现 , 只需直接使用引用定义的名字即可 , 而取地址符是不用绑定类名的 , 直接在变量(对象)左边写上& 即可(变量可以是指针或引用 , 毕竟它们也算是变量)。

    int i = 0;
    int &ri = i , *pi = &i; //前一个&是引用 , 与类型名绑定在一起 , 后一个是取地址
    cout << ri << endl; //输出i的值
    cout << &i << endl; //输出i的地址
    cout << &ri << endl; //输出ri的地址
    cout << &pi << endl; //输出pi的地址

          为什么要有引用 , 在C++这样一种重视效率的语言里 , 必然需要这样一种类型 , 但我们调用一个函数时 , 就必须把参数全部复制一次 , 这样既浪费时间又浪费空间 , 但当我们把函数列表中的形参改为该类型的引用时 , 编译器就不会把整个对象复制进去 , 而只是把对象的地址传过去 , 这样在函数里使用的就是实参本身了 , 也能够修改它的值。

    void reference_test(int &i){ //传入的是引用,不是地址!
        cout << i <<endl;
        i = 0;
        cout << i << endl; //离开函数后被传入的i的值为0
    }

            注意在调用函数的时候直接使用对象名即可 , 不要再加一个& , 那样会变成传地址(参照上文)。

    int i = 5;
    reference_test(i); //正确 ,i的值变为0
    //reference_test(10); 错误 , 10是常量
    //reference_test(&i); 错误 , &i是i的地址 , 不是int型

            现在讲一下为什么不能把常量赋给引用 , 这里需要引入左值和右值的概念, 从字面并不能准确的理解左值右值 , 从对象的用途来讲 , 右值用的是对象中的内容而不在乎对象存储的位置(内存中) , 而左值既要内容也必须需要存储位置 , 从语句上讲 , 左值能够位于赋值表达式左边被赋值 , 右值则不然 , 从存在时间来讲 , 左值在作用域内会一直存在 , 右值在使用后就会马上被销毁。 综上来看  ,左值在使用场合上多于右值 , 也能代替右值 , 但右值却不能代替左值 。 定义的内置类型变量 , 对象 , 指针 , 引用等都是左值 , 而常数 , 字符串常量 , 变量间运算后的值(如 i + 5  , 而不是 i = i + 5) , 函数返回的非引用值等都是右值。 这就是为什么 int &ri = 5 是非法的了。因为引用必须绑定到左值。右值引用(&&)暂不讨论。

    int i = 0 , &ri = i , *pi = &i;   //均为左值
    //下列均错误 , 均为右值
    //ri = 10;
    //ri = i + 5;
    //ri = return_int();    return_int返回一个int值
    

        这里也只是对引用的基本认识和用法做一个了解 , 后面我会慢慢更新。

    展开全文
  • c++ 取地址运算 指针变量

    千次阅读 2013-08-08 10:56:22
    一、取地址运算符&(内存地址) C++编译的程序占用的内存分为以下几个部分: 1.栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。与其它分区不同,变量的...
  • 关于C语言取地址运算符”&

    万次阅读 多人点赞 2015-04-14 10:58:45
    无法理解”&“或者说”地址“、”取地址“,是因为你站在高级(自然语言)语言的层面,而不是机器本身。任何变量都是数据,数据就会在硬件机器上有他的存储空间,存储空间有对应的位置,来方便我们操作这个存储空间...
  • 指针运算 到底什么是指针呢? 内存就是一系列有序列号的存储单元,变量就是编译器为内存地址分配的昵称,那么指针是什么呢? 指针就是一个指向另一个内存地址变量的值 指针指向变量的内存地址,指针就像该变量...
  • 不错,a和&a的值虽然一样,但是前者表示的是数组a的首地址,进阶为数组元素长度,而后者也是表示数组a的首地址(或许有些人不同意我这个观点,对地址取地址应该是指向指针的指针呀。不过你注意了没有,a和&a值是一样...
  • & 取地址符的用法总结

    万次阅读 2018-05-29 11:27:00
    2 = 0一种是取地址int* p = &amp;a; 一种是声明引用,相当于定义变量别名: int a = 3; int&amp; b = a; // b是a的引用,a,b是同一个变量b = 4; // a也变化为4int c = 2; b = c; // 是赋值给b或a,而...
  • 计算机是如何运算

    万次阅读 多人点赞 2019-04-29 10:38:05
    2、计算机如何实现加法运算? 3、计算机如何在庞大的内存里面找数据? 4、计算机如何执行代码? 5、编程的本质是什么? 2.关键词 继电器,串联,并联,振荡器,计数器,地址,内存,RAM阵列,锁存器...
  • 数组名取地址所算数运算应注意的"trap" 直接看代码: #include int main() { int array[5]; printf("array : %p\n",array); printf("array + 2 : %p\n",array+2); printf("&array + 2 : %p\n...
  • )或(|)广播地址计算方法IP地址子网掩码网络地址广播地址 我的学习过程 今天学习UDP的单播、多播、广播中,出现了广播地址的计算。这个涉及到十进制转二进制,位运算等概念。位运算按位取反、与、或让我想起了之前...
  • python 负数取模运算实例

    千次阅读 2021-02-04 07:39:43
    整除运算(除法计算出结果后,向下取整) 使用整除运算用 // 1 // 2 3 // 2 1 10 // 3 3 10 // -3 -4 10 / 3 = 3.3333 故:10 // 3中对3.333 向下取整 等于 3 10 / -3 = -3.333 10 // -3 中对-3.33 向下取整 等于 -4 2....
  • (1) 如果需要获取某个变量的地址,可以使用取地址运算符&。 char *pa = &a; int *pb = &b; (2) 如果需要访问指针变量指向的数据,可以使用取值运算符* printf("%c,%d\n",*pa,*pb) 注意: 避免访问...
  • 面试官:“Ipv4地址可以转为Long类型的数字知道吧?你写一下这个转换的代码。” 对计算机基础逐渐模糊的小黄一脸懵逼,毕竟工作中很少会用到,只记得ip地址和整数是可以相互转换的,但是从来没有自己实现过。于是在...
  • c语言 &取地址运算符的理解

    万次阅读 2018-01-22 15:19:39
    之前对取地址符“&”的理解——返回第一个字节的地址。 int i =2; int * p = &i ,这里,*p代表以p的内容为地址的变量。即文中所说:(*p)操作是这样一种运算,获取指针p的值(变量的地址)找到对应的变量的值-----...
  • 前言忘记进制的同学先看这里: 十进制数,没有前缀 二进制数,前缀是0b 八进制数,前缀是0o 十六进制数,前缀是0x let decimalInteger = 17 let binaryInteger = 0b10001 // 二进制的...运算通常用于二进制位操作;
  • 中央处理器主要包括两个部分,即控制器、运算器,其中还包括高速缓冲存储器及实现它们之间联系的数据、控制的总线。一、控制器是整个计算机系统的指挥中心在控制器的指挥控制下,运算器、存储器和输入/输出设备等...
  • 算术运算和逻辑运算

    千次阅读 2020-01-22 10:07:39
    计算机的核心功能,就是运算。...加法指令就是一种算术运算指令,当时这条例子中的,ADD R0, [6] 这条加法指令是将R0寄存器当中的数,和存储器地址为6的存储单元的数相加,并将结果放回到R0寄存...
  • 运算符 :用于一个对象的地址 (2)* 运算符:作用于指针时表示访问指针所指向的对象 如下图: 它运行结果为: a20 &a0093F968 b0093F968 *b20 这个时候,看结果我们就会发现为什么&a与b为啥不一样的。 ...
  • 运算器是计算机的核心部件,主要负责对信息或数据进行各种加工和处理,它在控制器的控制下,与内存交换信息,并进行各种算术运算和逻辑运算,在运算器内部有一个算术逻辑单元(Arithmetic Logic Unit,ALU)。运算器还...
  • c中取地址运算符&与指针取成员运算符->的优先级,是->的优先级高于&。 可以通过以下小程序测试。 假设一个结构体形如: struct Test { int apple; }; 现在声明并定义一个结构指针,并初始化成员: struct Test ...
  • java中异或怎么运算

    千次阅读 2021-02-12 09:46:08
    java中异或是以二进制数据为基础进行运算的;也就是说当代码中使用到异或运算时,都会先将两个条件进行转换,转换成二进制数据后,再进行运算运算规则:两个操作数的同位中,如果值相同(都是0或者都是1)则为0,...
  • A:逻辑运算, and or not xor等等,有专用电路直接实现,也就是所谓的逻辑门电路,而且结构简单,比数字比较器、桶形移位器要简单,通常情况下速度更快一些。 C:关系运算, &gt; &lt; = &gt;...
  • 数组名与数组名前加取地址

    千次阅读 多人点赞 2016-01-12 15:03:59
    我们知道数组名与数组名取地址所得到的地址都是一样的,由第一行的输出可以验证这一结论。那么如果都在这基础上加上指针运算呢,一开始我也觉得结果是相同的,但事实是让我懵逼的。由第二行输出可以知道a+1后指针
  • C指针 取地址符& 取值符*

    千次阅读 2020-04-13 07:29:47
    取地址运算符和取值运算符 获取某个变量的地址,使用取地址运算符&,如: char* pa = &a; int* pb = &f; 如果反过来,你要访问指针变量指向的数据,那么你就要使用取值运算符*,如: printf("%c, %d\n", *pa, *pb); ...
  • 运算符号包括哪些

    千次阅读 2021-07-27 08:00:37
    运算符号包括哪些2020-02-13 10:14:34文/董月运算符号有如加号(+),减号(-),乘号(×或·),除号(÷或/),两个集合的并集(∪),交集(∩),根号(√ ̄),对数(log,lg,ln,lb),比(:),绝对值符号| |,微分(d),积分...
  • 位操作实现加减乘除四则运算 2013-02-07 23:09:50 分类: C/C++ 1. 题目描述 如何使用位操作分别实现整数的加减乘除四种运算? 2. 解决方案 需要熟练掌握一些常见功能的位操作实现,具体为: 常用...
  • 移位运算(计算机组成原理15)

    千次阅读 多人点赞 2020-10-11 10:52:59
    三种移位运算的方法:算数移位+逻辑移位+循环移位

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 182,457
精华内容 72,982
关键字:

哪个是取地址运算