精华内容
下载资源
问答
  • 2019-07-14 22:07:38

     

    首先明确的是,在编译的时候编译器会把所有的变量名都转换成相对的内存地址,所以变量名不占内存。内存的最小单位是字节。
    1、普通变量
    如: int a;
    声明一块名为a(首地址)大小为4字节的内存空间,变量代表了一个存储单元,此时未初始化,所以a只是表示这块地址的名称,没有其他意义。&a取a的地址。*a会出错
    a=1;
    给这块内存初始化值(把1存到a表示的这块地址中),这时a就代表1。


    2、指针变量
    (转自:https://blog.csdn.net/cool_oyty/article/details/8078632)
     在编译器里定义一个指针变量,编译器会给这个指针变量分配一个空间,这个空间里存放的是一段内存的首地址,先解释一段内存,一段内存的大小是与你所定义的指针类型相关的,比如int,这段内存占四个字节(当然要看你的机器是多少位的了),则这段内存的首地址是第一个字节的地址,如char类型,占一个字节,这段内存的首地址就是这个字节的地址,还如结构体类型,此时内存大小要看该结构体的所有属性所占内存之和。现在解释这个空间,编译器给指针分配的空间大小是和CPU的寻址长度相关的,比如32位的CPU,它的寻址长度为32位,那么这个空间也就占四个字节,其实不管你定义什么样的指针类型,这个空间只是用来存地址,只占四个字节,而真正该空间所存的地址是哪一段内存的首地址才和所定义的指针类型相关。 

    作者:Meditating 
    原文:https://blog.csdn.net/wu9797/article/details/78082795 

    int *q;只有地址,没有内存空间。这个地址是随机地址。

    (1)没有申请内存空间:

    int *q;

    *q = 1;

    cout<<*q<<endl;

    错误!指针变量q没有空间,不能直接存放数据。

    注:指针变量赋值后就是一个指针

    (2)申请内存空间:

    int *q = new int;

    *q = 1;

    cout<<*q<<endl;

    正确,存放数据之前给指针变量申请了一个int类型大小的堆内存空间。

    2、对比:

    int *q;

    *q = 1;

    错误!q没有指向一块内存空间,不能直接存放数据。

    int *q, a = 1;

    q = &a;

    正确,两次q的地址不一样。q=&a:q指向变量a所在的内存空间,变量a是一个int型,在内存中有大小为int类型的内存空间。算是间接地给q分配了空间吧。
    --------------------- 
     

    3、指针

    系统为每一个内存单元分配一个地址值,C/C++把这个地址值称为“指针”。如有int i=5;,存放变量i的内存单元的编号(地址)&i被称为指针。

    3、指针变量和指针的区别

    (转自:https://blog.csdn.net/u011555996/article/details/79496203

    指针变量则是存放前述“地址值”的变量,也可以表述为,“指针变量”是存放变量所占内存空间“首地址”的变量(因为一个变量通常要占用连续的多个字节空间)。比如在int i=5;后有一句int *p=&i;,就把i的指针&i赋给了int *型指针变量p,也就是说p中存入着&i。所以说指针变量是存放指针的变量。
    有一个事实值得注意,那就是有不少资料和教科书并没有如上区分,而是认为“指针是指针变量的简称”,如对int *p=&i;的解释是:声明一个int *型指针p,并用变量i的地址初始化;而严格说应该是声明一个int *型指针变量p才对。所以有时看书要根据上下文理解实质,而不能过于拘泥于文字表述。

     

    注: 运算符

    &返回变量的地址。&a; 将给出变量的实际地址。
    *指向一个变量。*a; 将指向一个变量。
    更多相关内容
  • 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。 现在假设有一个 char 类型的变量...
  • 地址、指针、指针变量详解

    千次阅读 2021-11-10 00:34:39
    指针和指针变量的关系 指针就是地址地址就是指针。...指针变量就是存放内存地址的变量。 指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。 ...
    指针和指针变量的关系
    • 指针就是地址,地址就是指针。
    • 地址就是一个内存单元的编号,如1001 (地址值(简称地址)不可以是小数,也不可以是负数)。
    • 指针变量就是存放内存地址的变量。

    指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。


    cd4356

    p、*p 和 &p的区别
    • * 取值运算符

    • & 取地址运算符

    p是指针变量,它存储的是另一个同类型变量的地址
    cd4356

    *p表示p所指向的变量的值(即p存放地址对应变量的值。如下图,p存放的是变量i的地址,那么*p取的就是变量i的值)。所以*p等价于a,即*p=a
    cd4356

    &p表示指针变量p本身的地址(注意指针变量的地址指针变量的值的区别。如下图,指针变量p的值是变量i的地址;指针变量p的地址是其所在内存存储单元的地址)。所以p等价于&a,即p = &a &a = p
    cd4356


    如下图中,1001是指针变量p的地址,1007是变量i的地址。指针变量存放的是变量i的地址,也就是指针变量的值。所以p=1007,*p=5,&p=1001
    cd4356
    注意:p是指针变量,存放的是地址(内存单元的编号)。

    • 不能给指针变量赋数据值,如p = 100,这是错误的,无法通过编译;
    • 只能赋地址值,如p = &i;

    注意:*p表示的是数据值,即p指针指向地址的内容。

    • 不能给*p地址值,如*p = &i; 这是错误的,无法通过编译;
    • *p表示的是数据值,所以只能赋数据值。如*p = 100;或将地址值 &i 强转成数据值,如*p = (int)&i;


    星号*的用途

    p是指针变量,*表示这是一个指针,int表示该指针变量所指向的数据的类型。 定义指针变量时的* 和 使用指针变量时的*意义完全不同。

    • 指针定义中的*,表示定义一个指针变量。(如int *p;表示定义一个int类型的指针变量)

    • 使用指针变量时的*,表示取值运算符。(如*p,表示获取指针变量p指向地址的内容)



    int *p; 和 int **p; 解析
    • int *p;表示定义一个指向int类型的指针变量p

    • int **p; 表示定义一个指向int *类型的指针变量



    引用

    局部变量(方法内的变量),在方法执行完毕后,就会被释放。

    • fun1()和fun()2没有修改指针变量L的内容

    • fun()3是传引用调用,会修改实参的内容。&L表示取指针变量L的地址,拿到指针变量L的地址,就可以修改变量的内容了

    什么是引用?

    • 引用是一个变量的别名,本身不单独分配自己的内存空间,而是与该变量共享一块内存空间。所以可以通过引用来修改变量的值。如下图的L3和L共享一块内存空间,可以通过L3来修改L的内容。

    cd4356
    地址、指针、引用、指针变量有什么区别

    展开全文
  • 相信大家都知道这样一个学习指针的观点:要想彻底理解 C 语言中的指针,首先一定要理解 C 语言中变量的存储实质。谈到变量的存储,我们就不得不先说说计算机的内存概念。计算机的内存是一个用于存储数据的空间,由一...

    相信大家都知道这样一个学习指针的观点:要想彻底理解 C 语言中的指针,首先一定要理解 C 语言中变量的存储实质。谈到变量的存储,我们就不得不先说说计算机的内存概念。计算机的内存是一个用于存储数据的空间,由一系列连续的存储单元组成,它就好像电影院中的座位一样,如图 1 所示。

    192a9b2791a96177c2d745f3398ef03f.png

    图 1 内存中某一区域的编号

    在电影院中,为了保证大家能够快速找到自己的座位,每个座位都用一个唯一的编号来标识。而对计算机内存来说,它同样需要像座位一样编号,这样我们才能够知道内存中的数据存放在什么位置,这就是我们所说的内存编址。如图 1 所示,每一个内存单元都有一个唯一的地址,系统根据这个地址来识别内存单元,在地址所标识的存储单元中存取数据。在这里,我们需要分清两个概念:

    内存单元的地址。如图 1 中的编号(如 10000、10001 等),通过引用这些不同的地址编号,我们就可以使用不同内存单元中存储的数据。值得注意的是,内存单元的地址是固定的,在程序中不能修改。

    f677619a6fe09f5d0e7384f6478b9916.png

    图 2 内存单元中的数据

    内存单元中的数据。如图 2 中的表格内的数据,编号为 10000 的内存单元保存的数据为 119,编号为 10001 的内存单元保存的数据为 120,编号为 10002 的内存单元保存的数据为 121。与内存单元的地址不同,内存单元中的数据是可以被程序修改的,例如,可以在程序中将编号为 10001 的内存单元的值由 120 修改为 122。

    在了解计算机内存之后,下面来看看 C 语言中的变量是如何存储的,如下面的代码所示:

    int i; char c;

    在上面的代码中,我们声明了两个变量,它们将要求系统在内存中分配一个类型为 int 型的存储空间和一个类型为 char 型的存储空间。因此,执行上面两个语句后,内存中的映像可能如图 3 所示。

    05103424522bba062ff74a863a677df7.png

    图 3 变量的存储

    如图 3 所示,在 32 位计算机中,int 类型的变量占用 4 字节(即图 3 中编号为 10000~10003,共 4 个存储单元),char 类型的变量占用 1 字节(即图中编号为 10004 的存储单元)。其实这里很容易看出,变量名实质上就是内存单元地址的一个符号,如变量i代表内存地址 10000(变量所占内存单元的首地址),而变量 c 代表内存地址 10004。当用户使用变量时,本质上是访问该变量所对应的内存单元。

    在申请变量之后,接下来需要为变量赋值,如下面的代码所示:

    i=100; c='w';

    对于上面的赋值语句,相信大家都能够很好地理解,它表示将整型常量 100 保存到变量i中(实质上是将 100 保存到内存地址 10000 为起始地址的 4 个存储单元中),而将字符常量 w 保存到变量 c 中(实质上是将 w 保存到内存地址为 10004 的存储单元中)。因此,在执行上面的语句后,我们可以利用这样的形象来理解,如图 4 所示。

    b0305c0c94bb377e1cfc254ffae6488b.png

    图 4 变量赋值后的存储

    看到图 4,你或许会问,为什么内存地址为 10004 的存储单元存储的是 119,而不是 w 呢?这很简单,字符常量保存的是其 ASCII 码值,所以在编号为 10004 的内存单元中保存的是字符常量 w 的 ASCII 码 119。

    到现在为止,相信你对变量的申请与赋值的内存分配变化都有了一定的了解。那么我们现在反过来继续问,变量究竟存储在哪里,我们要如何得到变量的存储地址呢?

    要想知道变量的存储地址,就需要用到运算符“&”了,使用该运算符可获得变量的内存单元地址(如果变量占用多个内存单元,将得到首地址)。例如,要在屏幕上显示上面的变量 i 与 c 的地址值,可以使用如下代码:

    printf("%xn", &i); printf("%xn", &c);

    这里以上面图中的内存映像为例,屏幕上显示的不是 i 值 100,而是显示i的内存地址编号 10000(即如果变量占用多个内存单元,将得到首地址)。同理,显示的不是 c 值 w,而是显示 c 的内存地址编号 10004。当然,在实际操作中,变量 i 与 w 的地址值不会是这个数了。

    了解变量的存储与地址之后,现在我们可以来看看指针的概念了。

    在 C 语言中,将内存单元的编号或地址称为指针。可通过一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址,或称为某内存单元的指针。它与其他一般变量所不同的是,一般的变量包含的是实际的、真实的数据;而指针只是一个指示器,它告诉程序在内存的哪块区域可以找到数据。

    下面来看一条声明一个指向整型变量的指针的语句:

    int *p;

    很显然,在上面的代码中声明了一个指针变量 p。在执行该的代码后,我们可以通过图 5 所示的存储结构来理解(在 32 位系统中,指针的宽度是 4 字节)。

    b8043d8d52b12c4d6cc42cdae4abf640.png

    图 5 指针变量 p 的存储情况

    由图 5 中可以看出,指针变量 p 与前面的一般变量 i 与 c 并没有什么本质的区别。那么,它为什么又会被称为“指针”呢?其实,关键是要看这个变量所存储的内容是什么。继续来看下面的语句:

    p = &i;

    即上面的代码表示把i地址的编号赋值给指针变量 p,也就是说在 p 里面写上i内存地址编号 10000(如果变量占用多个内存单元,将得到首地址),结果图 6 所示。

    e950664275c516e9230698f9d6066c99.png

    图 6 执行 p=&i 后的存储情况

    如图 6 所示,在指针变量 p 中保存变量i的首地址编号 10000,因此,通过指针变量 p 就可间接访问内存单元 10000 开始的 4 个内存单元。也就是说,程序先通过指针变量 p 的值找到变量i的首地址编号 10000,再通过该地址即可访问对应的内存单元,这种访问数据的方式也称为“间接访问”。

    在了解上面这些原理之后,下面的语句就不难理解了:

    /*指针的地址*/ printf("%xn", &p); /*指针保存的地址*/ printf("%xn", p); /*指针所保存的地址的值*/ printf("%dn", *p);

    以上面图中的内存结构为例,对于语句“printf("%xn”,&p)”,很显然输出的结果就是变量 p 的首地址编号 10006(即指针的地址);而对于语句“printf("%xn”,p)”,输出的结果就是变量i的首地址编号 10000(即指针保存的地址);而语句“printf("%dn",*p)”输出的结果就是变量 i 的值 100(即指针所保存的地址的值),它等价于语句“printf("%dn",i)”。

    最后来继续温习一下指针的 4 个基本概念。

    1)指针的类型

    从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型,如下面的代码所示:

    int *p; // 指针的类型是int* int **p; // 指针的类型是int** int (*p)[3]; // 指针的类型是int(*)[3]

    2) 指针所指向的类型

    当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当作什么来看待。从语法上看,只需要将指针声明语句中的指针名字和名字左边的指针声明符“*”去掉,剩下的就是指针所指向的类型。如下面的代码所示:

    int *p; // 指针所指向的类型是int char *p; // 指针所指向的类型是char int **p; // 指针所指向的类型是int* int (*p)[3]; // 指针所指向的类型是int()[3] int *(*p)[4]; // 指针所指向的类型是int*()[4]

    3) 指针的值

    指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在 32 位程序中,所有类型的指针的值都是一个 32 位整数,因为 32 位程序里内存地址全都是 32 位长。

    指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为 sizeof(指针所指向的类型)的一片内存区。所以当我们说一个指针的值是 XX 的时候,就相当于说该指针指向了以 XX 为首地址的一片内存区域;而我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

    4) 指针本身所占据的内存区

    指针本身占了多大的内存?只要用函数 sizeof(指针的类型)测一下就知道了。在 32 位平台中,指针本身占据了 4 字节的长度。

    展开全文
  • C语言指针基础知识点(一)--指针及指针变量

    千次阅读 多人点赞 2019-12-01 21:05:28
    一个变量的地址称为该变量的指针 例如,地址2000是变量 i 的指针 2.一个变量专门用来存放另一变量的地址(即指针),则它称为指针变量 指针变量的值是地址 正确区分:    例如,可以说变量 i 的指针是...

    指针系列目录

      C语言指针基础知识点(一)–指针及指针变量
      C语言指针基础知识点(二)–指针变量的引用
      C语言指针基础知识点(三)–指针变量作为函数参数
      C语言指针基础知识点(四)–通过指针引用数组
      C语言指针基础知识点(五)–用数组名作函数参数
      C语言指针基础知识点(六)–通过指针引用多维数组
      C语言指针基础知识点(七)–通过指针引用字符串
      C语言指针基础知识点(八)–返回指针值的函数
      C语言指针基础知识点(九)–指针数组和多重指针
      C语言指针基础知识点(十)–动态内存分配与指向它的指针变量


    指针基础点

    1.一个变量的地址称为该变量的指针

    例如,地址2000是变量 i 的指针

    2.一个变量专门用来存放另一变量的地址(即指针),则它称为指针变量

    指针变量的值是地址

    正确区分:
       例如,可以说变量 i 的指针是2000,而不能说 i 的指针变量是2000.指针是一个地址,而指针变量是存放地址的变量。


    入门第一栗:

    通过指针变量访问整型变量

    # include<stdio.h>
    
    int main()
    {
    	int a=10, b=100;
    	int *pointer1, *pointer2;
    
    	pointer1=&a;
    	pointer2=&b;
    
    	printf("a=%d\nb=%d\n",a,b);
    	printf("*pointer1=%d\n*pointer2=%d\n",*pointer1,*pointer2);
    
    	return 0;
    }
    

    3.定义指针变量:

    类型名 * 指针变量名

    展开全文
  • 变量的指针和指向变量的指针变量

    千次阅读 2020-04-24 20:53:08
    如果有一个变量专门用来存放另一变量的地址(即指针),则它称为指针变量” 定义一个指针变量 定义指针变量的一般形式为 基类型 *指针变量名; 说明 可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它...
  • 对于指针,指针变量指针变量(通常简写成指针)指向的一些理解 1.指针的定义: ...若指针变量存放的是某个对象(这个对象一般来说是内存空间)的地址,则称这个指针变量指向该对象。 下面放一张总结笔记 ...
  • 用来存放指针的变量称为指针变量,它是一种特殊的变量,它存放的是地址值。2.定义指针变量的一般形式为:类型名 *指针变量1,*指针变量2,…;″类型名″称为″基类型″它规定了后面的指针变量存放的数据类型,...
  • 指针变量变量地址

    千次阅读 2017-06-19 15:12:49
    一、基本概念   存储单元一般应具有存储数据和读写数据的功能,以8位二进制作为一个存储单元...存储地址一般用十六进制数表示,而每一个存储器地址中又存放着一组二进制(或十六进制)表示的数,通常称为地址的内容。
  • 指针变量是用来存放另一个变量的地址的(即指针)。3、指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。扩展资料指针与C语言关系:大...
  • 前言 想必在萌新的世界里必然会出现这样的一幕:当几人畅聊时突然有人说起了编程世界的恐怖的存在->...指针即某一个单元的地址存放地址的变量称为指针变量,通过解引用该指针变量就可以访问该地址对应的单元 ...
  • 指针变量是一个变量,它保存了基本类型变量的地址。  如果指针变量p保存了变量a的地址,那么称作p指向了a,*p 就是变量a。  如果p是一个指针变量,*p 表示了以 p 的内容为地址的变量,就是p指向的变量。   *p   ...
  • 2.C语言指针变量

    2021-05-21 05:23:38
    存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。为了表示指针变量和它所指向的变量之间的关系,在...
  • 如果能够将取得的变量地址传递给一个函数,能否通过这个地址在那个函数内访问到外面的变量?答案是肯定的。scanf(&amp;amp;amp;...指针类型的变量就是保存地址变量,就是保存&amp;amp;a
  • 【理解】指针:所指变量地址

    千次阅读 2019-09-28 21:42:21
    2.指针运算符“ * ”用来定义指针变量指针变量(简称指针)是一种特殊的变量,它存储的内容只能是内存地址,比如存储另一个变量的地址。 语法格式:指针所指向的类型 * 指针变量的名称; 用一个例子说明指针变量的...
  • 对c语言普通变量和指针变量的理解

    千次阅读 2018-05-11 20:02:04
    一、普通变量和的本质区别 在说到普通变量和指针...普通变量的指针变量的区别就是,这两种变量的值的所表示的意义不同, 一般来说,普通变量的值,只是供程序员所使用的值,而指针变量的值则不同,它的值存放的是其...
  • 再次拿起C是2012年8月1日,回想第一次接触C还是大一下学期,大约是2006年。。。。大学C期末考试时我仍记得C考了76分……那年要不是C完全是可以拿一等奖学金的 六年了 之前虽熟悉C但是...只要作到这些,指针也是不难...
  • C++定义指针变量 | 使用指针变量

    千次阅读 2020-12-14 08:55:25
    C++指针变量的定义 C++规定所有变量在使用前必须先定义,即指定其类型,在编译时按变量类型分配存储空间,对指针 变量必须将它定义为指针类型。 //定义整型变量 int i,j; //定义指针变量 int *point_num; 上述...
  • 指针和指针变量

    千次阅读 多人点赞 2019-05-12 22:06:11
    为了表示指针变量和他所指的变量之间的联系,在程序中用“*”表示"指向",如果定义变量 i 为指针变量,那么 *i 就表示指针变量 i 里面存放地址所指向的存储单元里面的数据,很绕吧,可以在纸上画一画。 ...
  • 指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,否则将引起错误。在C语言中, 变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。 C语言中提供了地址运算符&来表示变量的地址...
  • 指针变量

    千次阅读 2020-12-23 13:50:02
    指针变量和普通变量一样,都是用于存放数据的,只是指针变量存放的数据很特殊,是为存地址。一般情况下,如果不考虑指针强制转换的话,我们要求某个类型地址必须放到对应类型的指针变量中,如下所示。 int a=10; int *p...
  • 什么是指针?在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据...既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。可以...
  • 指针变量与数组的关系及什么是指针数组: 一维数组: 数组原本就是以指针的格式使用的,数组名a相当于char * const a。但这里需要注意的是数组名表示的是一个数组的首地址,是一个地址常量,不能给地址常量赋值,...
  • 指针与指针变量

    千次阅读 2019-05-09 16:00:16
    通过地址能找到所需的单元变量地址形象化的称为指针指针式通过地址来体现的,地址指向所需的单元变量,即通过指针能够找到以它为地址的内存单位 存储单位的地址 存储单位的内容 对变量的访问都是通过地址...
  • C语言指针变量

    2021-11-23 20:44:21
    一个变量的地址称为该变量的指针。 如果一个变量专门用来存放另一个变量的地址(指针),则称它为“指针变量”。 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量指针变量的值就是某份数据的地址,...
  • 指针,地址指针变量之间的区别和联系

    万次阅读 多人点赞 2018-03-24 17:39:57
    但是指针的概念比较抽象,难于理解,而且一些复杂的程序中都是离不开指针的,如果不能理解指针,那么就不能理解较为复杂的程序了,作者结合了自己学习C++的经验,对指针,指针变量地址作如下阐述。1.什么是指针:...
  • 使用指针变量作为函数参数|地址传递与指针传递实例总结地址传递值传递错误写法1错误写法2 地址传递 指针类型可以作为函数参数的类型,这时视为把变量的地址传入函数。如果在函数中对这个地址的元素进行改变,原先的...
  • 指针变量赋值地址

    千次阅读 2020-02-09 20:23:15
    一个指针变量可以可以通过不同的方式获得一个确定的地址值,从而指向一个具体的对象(每当一个指针中存放了一个变量的地址的时候,我们就说这个指针指向了这个变量)。 int k=1,*q,*p; q=&k; 这时可以说,q指向...
  • 指针和指针变量的区别

    千次阅读 多人点赞 2021-05-12 22:17:08
    为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。 为什么存在地址? 为了提高效率,快速标识与定位。 左值与右值 空间 对应 左值 例:(对a来说) a = 20; //当...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 330,422
精华内容 132,168
关键字:

存放地址的变量称为指针变量