精华内容
下载资源
问答
  • 数据在内存中有两种存储方式: ...我们(程序员)一般可以通过C语言中的union和指针判断当前机器采用大端存储还是小端存储。 1. 使用union #include <stdio.h> union myunion {  int a;  ...

    数据在内存中有两种存储方式:

    小端存储:数据的高位字节存储在内存的高地址处,低位字节存储在内存的低地址处。

    大端存储:与小端存储的方式正好相反

    我们(程序员)一般可以通过C语言中的union和指针来判断当前机器是采用大端存储还是小端存储。

    1. 使用union

    #include <stdio.h>

    union myunion
    {
            int a;  
            char b; 
    };

    int main(int argc,char *argv[])
    {
            union myunion u;
            u.a = 1;
            printf("b = %d\n",u.b);//若输出的结果是1,则说明是小端存储,若输出的结果是0,则说明是大端存储。
            
            return 0;
    }

     2.通过指针
    #include <stdio.h>

    int main(int argc,char *argv[])
    {
            int a = 1;
            char *b = (char *)&a;
            printf("*b =%d\n",*b);//若输出的结果是1,则说明是小端存储,若输出的结果是0,则说明是大端存储。
            
            return 0;
    }

    展开全文
  • 数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取...

    一切皆为地址

    C语言用变量来存储数据,用函数来定义一段功能代码,它们最终都要放到内存中供 CPU 调用。

    数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

    202ea458-f961-4d7f-8442-64dc6ce814c8

    CPU访问内存时需要的是地址,而不是变量名或函数名。程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。

    何为指针

    4af34d0ac79a4bf2b45706d6e8401fbe

    计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。这个编号就是指针(Pointer)。

    也就是说,指针是一个变量,其值为另一个变量的地址(Address),即变量在内存中字节的编号。

    指针变量的声明

    与其他变量或常量一样,在使用指针存储其他变量地址之前,需对其进行声明。指针变量声明的一般形式为:

    type *var_name;

    其中 type 是指针的类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。

    如下图所示,x是一个整型变量,其值为8,p是一个整型指针,指向x。使用&操作符取得变量x的地址,将其赋给p,从而使p指向变量x的地址;使用*操作符即可访问该地址存储的变量值。

    ef869e81b26c4814a078728d4191998a

    用来声明指针的星号 * 与乘法所使用的星号是相同的。但在这里,星号是用来声明这个变量是指针。

    char *pc; /* 一个字符型指针 */

    int *pi; /* 一个整型指针 */

    float *pf; /* 一个浮点型指针 */

    double *pd; /* 一个 double 型指针 */

    指针变量的大小

    在32位计算机中,一个指针变量所占的字节数通常是4,在64位系统中通常为8。

    如下图所示,在64位机器上,指针变量所占的字节数都是8。

    e3c0f0e772da47a6843bddc04fa33aa7

    sizeof是C/C++中的一个操作符(operator),其作用是返回一个对象或者类型所占的内存字节数。

    10d591a0-805a-41d7-b437-94fd8b70bb48
    展开全文
  • 例子1:如果想通过指针引用一个变量,只知道地址(如2000)不够的,因为无法判断是地址为2000的一个字节中取出一个char型字符数据还是从2000和2001两个字节取出short型数据还是从2000-2003四个字节取出int或...

    问题:定义指针变量时为何要指定数据类型:

    不同类型的数据在计算机系统中的存储方式和所占的字节数是不相同的。

     

    例子1:如果想通过指针引用一个变量,只知道地址(如2000)是不够的,因为无法判断是从地址为2000的一个字节中取出一个char型字符数据,还是从2000和2001两个字节取出short型数据,还是从2000-2003四个字节取出int或float型数据?必须知道该数据的类型,才能按存储单元的长度以及数据的存储形式正确地取出该数据。

     

    例子2:你一定使用过*(p+1)吧!!那你告诉我你如果系统不知道指针变量p的数据类型,那结果会是多少?是偏移char型1个字节?int型4个字节?double型8个字节?

    展开全文
  • 判断数据在机器中的存储方式大端还是小端,只要将数据按字节顺序输出即可判断,因此这实际上同一个问题。 实现思路 先取数据地址,转换成单字节长度的类型(unsigned char)的指针,然后按照十六进制逐字节打印...

    判断数据在机器中的存储方式是大端还是小端,只要将数据按字节顺序输出即可判断,因此这实际上是同一个问题。

    实现思路

    先取数据地址,转换成单字节长度的类型(unsigned char)的指针,然后按照十六进制逐字节打印即可。
    我采用的输出格式为“%02x”,这种格式输出能够向右对齐,不足位补齐,补齐位为0

    #include <stdio.h>
    int main()
    {
    	int x = 12345678;
    	unsigned char *byte = (unsigned char *)&x;
    	printf("%x\n",x);
    	for(int i = 0;i < 4;i++)//4为int型数据的字节数 
    		printf("%02x ",byte[i]);//按照十六进制逐字节打印
    	return 0;
    } 
    

    程序以int型为例,若为其他数据类型,也可类似实现。只要修改对应的数据类型,并将循环的执行次数改为该数据类型的字节数,可以直接将4改为sizeof(int),sizeof(float)等。

    程序运行结果

    编译器为Dev-C++
    程序运行结果
    从运行结果来看,数据的存储方式为小端,其最低有效字节排在最小的地址处。因此十进制数12345678,即十六进制数0x00bc614e,首先打印出最小地址处的4e,然后依次是 61,bc,00。若存储方式为大端,输出应为00 bc 61 4e。

    展开全文
  • 在我们的电脑中,系统在会将多个字节的数据存储在一片连续的地址上,而将数据的各个字节从这片空间的高地址位开始存储还是从低地址位开始存储就决定了系统的存储字节序 1.1 小端字节序 在32位的操作系统中,int 类型...
  • 今天偶然看到这个题目,想了一下,然后在网上搜了一大堆,终于,...而我们在程序中与地址相关的就是指针了,所以基于这些理由,可以想象,我们可以从判断指针所占的字节数入手,编写代码: #include //由于要用到
  • 小端存储和大端存储  小端存储(Little_endian):字数据的高字节存储在高地址中,而字...如何判断cpu大端存储还是小端存储呢? 方法一.直接看内存进行判断 方法二.编写一个程序进行判断  程序一如下:(指针
  • return 作为函数返回值或结束语句,返回的数据指针,也就是数据存放的地址,而接口需要返回的真实的数据, 因为前后端使用的不同的内存系统,所以无法根据地址找到相应的数据,而echo print sprinf等这些能够在...
  • c语言中的指针入门

    2019-03-12 18:52:47
    c语言中的指针入门c与...对指针的理解:指针就是一个内存地址程序中数据在内存的存放位置。 实例引入 :现在假设我们需要写一个函数来将两个数的数值进行交换, int a =5, b = 7; //期望结果为a=7,b=5; 要求将...
  • 递归手写深拷贝 前提: 深拷贝和浅拷贝只针对Object和Array这样的引用数据类型的。...把一个对象赋值给一个新的变量时,赋的其实该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向
  • //大小端 小端:低地址存放小数据 (手机) 大端:低地址存放高数据(pc) 判断当前机器大端还是小端 //不同类型的指针,解应用所访问的内存字节大小不一样 //void不能解应用 没有具体的大小 ...
  • 指针用来做什么: 1,需要传入较大的数据时用作参数 ... 判断哪个被const的标志const在* 的前面还是后面。 强制转换:例如;p=(int)&i; int *num[2]={&a[0],&a[1]}; 指针数组只能存放地址...
  • 指针与数组

    2010-11-16 15:50:00
    看下面的程序:想下输出的“b”数组的地址还是数组的元素呢?#include using std::cout;using std::endl;int main(){ char b[] = "this is me"; cout return 0;}结果为:this is me为什么不是首地址而是字符串...
  • int型数据给出的地址是数据的起始地址 ...1. 通过指针类型强制转换并对整型数据首字节赋值,判断该赋值赋给了高位还是低位 typedef unsigned char BYTE; int main(int argc, char* argv[]) { unsigned int
  • 第六章——指针

    2011-03-11 23:31:00
    1.多字节数据地址是在最左边还是最右边的位置,不同的机器有不同的规定,这也正是大端和小端的区别,地址也要遵从边界对齐2.高级语言的一个特性就是通过名字而不是地址来访问内存的位置,但是硬件仍然通过地址访问...
  • 1.结构体内存对齐规则: 将默认的对齐数和当前数据类型所占字节进行对比,找最小的作为有效对齐数。 VS默认对齐数为8个字节 ...(3)怎样判断存储方式大端还是小端? 大端:低地址存高位,高地址存高位; 小端:
  • 数据结构——链表

    2020-02-06 15:28:21
    头插法: 使用头尾指针来描述链表,为新节点申请空间,放入数值 判断链表是否为空,为空,新节点就是头指针 ...3.在使用指针作为形参时,一定要注意分清楚变量一级指针还是二级指针 #include "func.h" vo...
  • ECMAScript基础 ...reference value 储存在heap 中的对象,也就是说储存在变量处得一个(指针 point),指向储存对象的内存地址。 为变量赋值时ecmascript会自动判断是原始类型还是引用类型,要实现这一点
  • 大话数据结构

    2019-01-10 16:35:22
    这样,所谓的判断某一年是否闰年就变成了查找这个数组的某一项的值多少的问题。 2.13总结回顾 37 2.14结尾语 38 愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。 第3章线性表 41 3.1开场白 42 门外...
  • 数据结构与算法.xmind

    2020-06-19 17:04:23
    只要下面还有数据,那就往下找,递归从最后往前翻。 反转链表 有递归和非递归两种方式 双向链表 循环链表 树 二叉树 完全二叉树 堆 满二叉树 哈夫曼树 哈夫曼编码 ...
  • 大话数据结构 程杰

    2018-09-01 10:06:43
    这样,所谓的判断某一年是否闰年就变成了查找这个数组的某一项的值多少的问题。 2.13总结回顾 37 2.14结尾语 38 愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。 第3章线性表 41 3.1开场白 42 门外...
  • 这样,所谓的判断某一年是否闰年就变成了查找这个数组的某一项的值多少的问题。 2.13总结回顾 37 2.14结尾语 38 愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。 第3章线性表 41 3.1开场白 42 门外...
  • 大话数据结构-程杰

    2014-07-13 23:45:52
    这样,所谓的判断某一年是否闰年就变成了查找这个数组的某一项的值多少的问题。 2.13 总结回顾 37 2.14 结尾语 38 愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。 第3章 线性表 41 3.1 ...
  • // 需要注意的是有时可能获取的IP地址是0.0.0.0,这时需要过滤掉 if(CString("0.0.0.0")==strAddress) break; // std::cout("第")("张网卡的IP地址是"); // long PID = _ttol...
  • 124_指针4_什么是指针 123_指针3_什么是地址 122_指针2_指针的重要性 121_指针1_指针用法初次简单介绍 120_函数_17_变量的作用域和存储方式 119_函数_16_函数复习 118_函数_15_递归 117_函数14_常用的系统函数和自己...
  • 这样,所谓的判断某一年是否闰年就变成了查找这个数组的某一项的值多少的问题。 2.13总结回顾 37 2.14结尾语 38 愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。 第3章线性表 41 3.1开场白 42 门外...
  • 这样,所谓的判断某一年是否闰年就变成了查找这个数组的某一项的值多少的问题。 2.13 总结回顾 37 2.14 结尾语 38 愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。 第3章 线性表 41 3.1 开场白 42 ...
  • 原题地址 ... 解题思路 建议收看MOOC对应章节的小白专场~~ ...这里链表最后不是指向NULL的话,如果零多项式就没法判断并输出0 0了,导致错误。 大家写的时候还是要细心一点~ 参考代码 #include &
  • C++ const

    2018-10-24 01:18:15
    一、cosnt修饰常量 const int a = 5;与int const a = 5;...根据const相对*的位置判断const修饰是指针的值还是指针的地址。 一、const位于*左边,表示指针所指数据是常量,不能修改其指向的数据的值,指针地址...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

判断地址是指针还是数据