精华内容
下载资源
问答
  • 问题:指定的类型变量地址 随意赋值给 其他类型指针是否可行?前期知识介绍,如下:程序运行时的数据存储地点是RAM区域,RAM即为动态存储空间,特点是断电时数据清空,物理位置处在CPU当中。RAM内存地址的范围解释:...

    问题:指定的类型变量地址 随意赋值给 其他类型指针是否可行?

    前期知识介绍,如下:

    程序运行时的数据存储地点是RAM区域,RAM即为动态存储空间,特点是断电时数据清空,物理位置处在CPU当中

    RAM内存地址的范围解释:

        若为32位(一字节8位,32位是4字节)cpu,内存地址大小范围在{ 0~[ 2^(32)-1 ] }=={ 0~4294967295 }之间,转化为16进制就是{ 00000000~ffffffff }之间。这时改CPU的RAM中最大地址范围。

        64位CPU地址空间计算如上,10进制是[ 0~18446744073709551999 ],16进制为[ 0000000000000000 ~ ffffffffffffffff ]。

    以下内容都按照 sizeof(int)=4说明!

    问题解答

    当程序中使用 int * 指针时,其指向的地址取值范围被局限于[ 00000000~ffffffff ],也就是十进制的[ 0~4294967295 ]之间。

    int *可容纳的范围非常宽,

    但定义变量时用:

     int a = 5;

    正确操作是:

    int * p = &a;

    然而错误的将代码编写为:

    int a = 5;

    char * p = &a;

    这时使用编译器进行编译的时候,如VC++6.0会报错。

    其实并不是无法运行,而是VC++6.0的编译器为了减少不必要的BUG而进行的优化。

    那么带着问题,让我们来分析这其中的原因,当进行

    int a = 5; 

    有可能系统会给变量a安排的内存地址是 CPU中的RAM中的最大编号:fffffffffffffffff(以64位操作系统来说);

    fffffffffffffffff 正确的赋值给 int * p 是没有问题的,但是如果将其赋值给来了 

    char * p ;

    这时就会出现 p 的存储范围过小,无法完全存储下 ffffffffffffffff 这个地址编号,实际 char * p 的存储会对改地址进行截断处理,有原本的 ffffffffffffffff 变为 ffffffff,如果后续存在调用 char * p 中的 p 时,p 并不是指向所期望的值 a = 5 ,而是指向一个地址为 ffffffffff 的内存单元,这事一个未知的数据。

    以上是举了一个 { (int 值)->char *} 例子进行说明,这是一个 “大地址”--到-->”小内存“时出现的问题。

    那么,“小地址”--到-->“大内存”时,以上的数据丢失的问题则不会出现。

    同样的也可以对float与double进行分析。注意到由于浮点的存储方式不同于整形变量,所以当对 (int 值)->( float * ) 分析时应考虑到这一点。

    得出结论:

    在将变量的存储地址赋值给指针时,为了不出现数据意外,需要求报的原则是:类型对应

    展开全文
  • 指针变量与一般变量

    声明:本人正在研读UNIX环境高级编程,相关博文为学习心得,观点可能会有错误,若那位大神发现错误,请留言指正,不胜感激。

    指针变量与一般变量

        C语言中,变量由两个特征描述,变量类型和变量名。变量类型决定了此变量在内存中所占空间大小,及字节数。如char占用1个字节,int占用4个字节。变量名是面向程序设计者而言的,当程序编译后,变量名被编译成为32bits的内存地址(此处已32位系统为例)。

        个人理解,指针也是一种变量,也拥有变量的特征:变量类型和变量名,不过对于指针,其称呼为指针(变量)和指针类型。如char * p ;此处p是一个指针变量,其变量名为p,其类型为char * 字符指针类型。

        指针的常见类型有两类:基本数据类型指针类型和指针指针类型(对于二级指针而言)。下例解释了二级指针中各个变量的类型。

    如char ** p ;此处,有3个变量,p为一个拥有char型指针指针类型的变量;*p为char型指针类型;**p为char型。

    函数与函数类型

        C语言中,函数也是有类型的,这里所说的函数类型不是函数的返回值类型,而是函数本身。函数本身的类型由两个特征来描述,函数的返回值和函数的参数列表。如int func(char * p) ;此函数类型由其返回值类型int和参数列表----参数个数和各个参数的类型来共同描述。

        在C语言中,函数类型通常使用函数指针类型来定义。如typedef int(*p)(char *p) ;此类中,定义了一个函数指针类型p,可以使用这一类型定义函数指针。如下例所示。

    #include <stdio.h>

    typedef int (*p)(char * p) ;

    int f1(char * p1)

    {

    printf("call f1\n") ;

    }

    int f2(char * p2)

    {

    printf("call f2\n") ;

    }


    void main(int argc , char * argv[])

    {

    p fp = NULL ;

    if(atoi(argv[1] == 1))

    fp = f1 ;

    if(atoi(argv[1] == 2))

    fp = f2;


    fp() ;  

    }


    在linxu命令行中输入:./a 1

    输出:call f1

    在linux命令行中输入:./a 2

    输出:call f2

        对函数指针所指对象(即函数)进行引用的方法和对其他类型的变量的值的引用方法不同,
    如 char c = 'a' ;  char * p = &c ;当需要引用p所指向的对象的值时,方法为char d = *p ;而对于函数指针,应用方法为fp(),如上例所示。

    展开全文
  • 笔者在学习的过程中也受到了以上的困扰,经过查阅资料后,得到以下... 目的:一个指针变量所占字节数 */ #include<stdio.h> int main() { char ch = 'A'; int i = 9; double x = 7.3; char * p =&ch; ...

    **

    为什么不同类型的指针变量所占字节数是固定不变的?

    定义指针时指定基类型有何作用?

    /2019年6月26日 /
    *
    笔者在学习的过程中也受到了以上的困扰,经过查阅资料后,得到以下理解:
    首先,让我们先上代码,通过例子来深入理解

    /*
    	2019年6月26日10:37:17
    	目的:一个指针变量所占字节数
    */
    #include<stdio.h>
    int main()
    {
    	char ch = 'A';
    	int i = 9;
    	double x = 7.3;
    	char * p =&ch;
    	int * q = &i;
    	double * r = &x;
    	printf("p、q、r的字节长度分别为:%d,%d,%d\n",sizeof(p),sizeof(q),sizeof(r));//p,q,r变量所对应地址的存储空间大小
    	printf("char:%d,int:%d,double:%d\n",sizeof(char),sizeof(int), sizeof(double));
    }
    /*
    在Visual C++6.0中运行输出的结果是:
    ----------------------------------
    p、q、r的字节长度分别为:4,4,4
    char:1,int:4,double:8
    -----------------------------------
    */
    
    定义一个指针:基类型 * 变量名
    我们发现无论定义的指针的基类型如何改变,但是输出的指针变量p,q,r所占字节长度均为4个字节。也就是说定义一个指针变量,则这个指针变量所占的字节数均为4个字节。(与计算机的地址总线位数有关)
    解释如下:
    我们以上例中的char * p = &ch为例,首先,我们要了解,计算机有很多个内存单元,每个内存单元都有其相应的编号,我们称之为地址(&ch),就如同家庭的的门牌号(&ch)一样,而指针变量便是存储这个地址的变量,就如同存放这个门牌号的一个门牌框(p)。而指针变量指向的对象(ch)就相当于这个门牌号对应的一间房子。
    门牌框----指针变量p
    门牌号----地址&ch
    房间------普通变量ch

    有了以上的比喻之后,我们知道,指针变量p一定是用来存放地址的一个变量,也就是门牌框一定是用来放门牌的。而我们计算机的地址的编号与控制均是由地址总线控制的,以32位地址总线为例,无论是第一个内存单元的地址,还是最后一个单元的地址,都要由32位总线同时进行控制。因此每个地址的编号均是由一个32位(4个字节)大小的数组成,因此无论指针变量指向的变量ch存放的是什么内容,它的空间是多大,都不会影响指针变量所存放地址所占的字节数,也就是说,不管你房间里装的什么东西,能装多少东西,门牌号的大小整个小区都是统一规格的(4个字节)。
    因此说,一个指针变量,无论它指向的变量占几个字节,该指针变量本身只占四个字节。

    |那定义指针变量时它的基类型到底有何作用呢?|

    首先,我们要知道一句话:一个变量的地址用该变量首字节的地址来表示。
    解释如下:
    还是上面那个比喻,假设你们村每户人家里所占有的房产数量各不相同,但是只要是自家的房子都连续的建在一起。比如有人家里是一间(char),有人家里是四间(int)等等,那么我们现在村支部要核查每户人家里的总资产,也就是你名下房子里面的东西。采取什么方法最合适呢?当然是,知道你家第一间房子的门牌号(&ch)然后再了解你名下有几间房子,由于你们村房子是顺序连续的,所以知道你家的第一间房的地址,再知道你家共有几套房,这样就能知道你家所有房子里的总资产了。
    因此,第一间房的地址就是该指针变量的首地址,然后指针变量的基类型就是该户人家里有的房间数。通过这个方式,就能将指针变量 (p)指向的普通变量(ch)所有的内容都获取到。

    总结
    1、指针变量所占字节数是不变的均为4个字节,因为其存放的是地址。
    2、定义指针变量时基类型是代表该指针变量所指向的变量所占的字节数。
    3、变量的地址都是用该变量首字节的地址来表示的,例如ch变量的首地址是1000H则char * p = &ch则是通过基地址说明该地址的内容是属于ch变量的内容(因为char只占一个字节)。即1000H是ch变量的地址,这个地址里面存放的是ch变量的内容。

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

    千次阅读 多人点赞 2019-05-12 22:06:11
    为了表示指针变量和他所指的变量之间的联系,在程序中用“*”表示"指向",如果定义变量 i 为指针变量,那么 *i 就表示指针变量 i 里面存放的地址所指向的存储单元里面的数据,很绕吧,可以在纸上画一画。 ...

    为了表示指针变量和他所指的变量之间的联系,在程序中用“*”表示"指向",如果定义变量 i 为指针变量,那么 *i 就表示指针变量 i 里面存放的地址所指向的存储单元里面的数据,很绕吧,可以在纸上画一画。

    指针变量的定义

    C语言规定所有变量在使用前必须先定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,他是专门来存储地址的,所以必须将他定义为“指针类型”。

    指针变量定义的一般形式为:

    基类型 *指针变量名
    

    比如:

    int *i;
    int *j;
    

    说明:
    1 “*”表示变量的类型为指针类型,指针变量名为i和j,而不是 *i 和 *j;

    2 在定义指针变量时必须指定其类型,指针变量的“基类型”用来指定该指针变量可以指向的变量类型。比如 “int *i”,表示,表示 i 只可以指向 int 类型的变量,又比如 “float *j”,表示 j 指向float 型变量。换句话说,“基类型”就表示指针变量里面所存放的“变量地址”,所指向的变量可以是什么类型的,说简单点就是:“以 int *i”为例子,“*”表示这个变量是一个指针变量,而“int”表示这个变量只能存放 int 类型变量的地址。

    3 为什么叫做基类型,而不直接叫类型?因此比如:“int *i”,其中 i 是变量名, i变量的数据类型是“int ”类型,,即存放的是 int 变量地址的类型,“int” 和 “”加起来才是变量 i 的类型,所以叫做基类型。

    4 “int i”,表示定义了一个指针类型 i,他可以指向 int 类型的变量的地址。他可以指向int类型的变量地址。但此时并没有给他初始化,即此时这个变量并未指向任何一个变量,此时的 “”只是表示该变量是一个指针变量,至于具体指向哪一个变量要在程序中指定。这个就跟定义了 “int j”;但是并未给他赋值。

    5 因为不同类型的数据在内存所占的字节数是不同的,比如:int型字节数据占 4字节,char型数据占 1 字节。而每一个字节都有一个地址,比如一个 int 类型数据占 4 字节,就有4个地址。那么指针变量所指向的是这 4 个地址中的那个地址呢?指向的是第一个地址,即指针变量里面保存的是他所指向的变量的第一个地址,即首地址。因为通过所指向变量的首地址和该变量的类型就能知道该变量的所有信息。

    6 指针地址变量也是变量,是变量就有地址,所以指针变量本身也是右地址的。只要定义了一个变量,程序在运行时系统就会为他分配内存空间。但是指针变量又是存放地址的变量,所以这里有两个地址大家一定要知道:
    一个是:系统为指针变量分配的地址,即指针变量本身的地址,
    另一个是:指针变量里面存放的另一个变量的地址。
    这两个地址一个是“指针”变量的地址,另一个是“指针变量的内容”

    7 地址也是可以进行运算的,我们后面会学会指针的运算和移动,比如“使指针向后移动1个位置”或者“使指针加1”,这个 1 表示什么呢?这个 1 与指针变量的基类型是直接相关的,指针变量的基类型占几个字节,这个 1 就代表的是几,比如指针变量指向一个 int 型变量,那么“指针移动 1 个位置”就意味着移动4字节,“使指针加1”就意味着使地址加 4,所以必须指定指针变量所指向的变量,即指针变量的类型。某种基类型的指针变量只能存放该种类型变量的地址。

    8 我们前面讲过两个指针变量相减的结果是一个常量,而不是指针类型 的变量。比如 两个”int *“型的指针变量相减,结果就是 int 变量,此时要是把相减的结果付给”int *“型就会报错,而且两个指针变量相减的结果是这两个地址之间的元素的个数,而不是地址的个数。原因也是一样。比如两个”int *“型的指针变量相减,第一个指针变量里面存放的地址是 1245036,第二个指针变量里面的存放的是 1245032,那么这两个地址相减的结果是几?是1 而不是4,因为 int 类型的变量只占 4字节,所以一个 int 元素就占 4 字节,两个地址之间相差 4 个地址,正好是一个 int 元素,所以结果就是 1.

    #include<stdio.h>
    int main(void)
    {
    	int *p, *q;
    	int k;
    	int i = 3;
    	int j = 4;
    	p = &i;
    	q = &j;
    	k = p - q;
    	printf("p = %d\n q = %d\n k = %d\n", p, q, k);
    	return 0;
    }
    
    展开全文
  • 先强调一点,免得以后忘记:通常我们所说的其实是指针变量,而不是指针。指针=变量的地址,指针变量则是存放变量地址的变量。所以要说指针变量,它的首要概念应该是:它本身是一个变量,然后再去理解他的行为与实现...
  • 变量的指针和指向变量的指针变量

    千次阅读 2020-04-24 20:53:08
    指针和指针变量的定义: 一个变量的地址称为该变量的...基类型 *指针变量名; 说明 可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量 例子 float *pointer_3; char *pointer_4; po...
  • 1.1 c & c++中的“指针、指针变量指针变量类型” 1.1.1 指针:1.是变量的地址2.指针的长度和计算机的字长相关,例如:在32位计算机中,指针的长度是32位,即4字节;在64位计算机中,指针的长度是64位,即8...
  • 指针变量及其定义

    千次阅读 2019-02-14 14:14:26
    指针和指针变量的区别 一:指针是一个地址,指针...(*)表示该变量类型指针变量类型指针变量名为i和j不是 *i 和 *j 。 在这里插入代码片 二:int *i; 表示该指针类型只能指向int类型的变量。在这里插入代码片 ...
  • 就是说,指针变量之所以知道要从指定位置取出几个字节,是由指针变量所指向的类型决定,现在这个类型就是int,与所保存的地址对应的变量类型一致,所以就正好取出其内容。、 指针变量+1的跨度,也是由指针变量所...
  • 假如有这么一个程序 int a = 0x44332211; int *p1 = &a; char *p2 = (char *)&...不同的地方在解指针的时候。 p1在解指针时,将0x00当作是四个字节的内存空间大小的首地址。然后以int的解析类型进行解析
  • C指向结构体变量的指针(结构指针变量)

    千次阅读 多人点赞 2018-04-22 17:03:32
    结构指针变量说明的一般形式如下:struct 结构名 *结构指针变量名 结构名和结构变量时两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不会对它分配内存空间。只有当某变量被说明为这种类型的...
  • 怎样定义指针变量

    千次阅读 2019-05-09 20:32:50
    定义指针变量的一般形式为:类型名 *指针变量 如:int *pointer_1,*pointer_2; 其中,int为定义指针式必须指定的“基类型”,指针变量的基类型用来指定此指针变量可以指向的变量的类型。 float *pointer_3 ; //...
  • 指针与指针变量

    千次阅读 2019-05-09 16:00:16
    指针式通过地址来体现的,地址指向所需的单元变量,即通过指针能够找到以它为地址的内存单位 存储单位的地址 存储单位的内容 对变量的访问都是通过地址进行的 访问方式: 1.直接访问:按照变量名进行访问。 2....
  • 指针基础点 1.一个变量的地址称为该...   例如,可以说变量 i 的指针是2000,而不能说 i 的指针变量是2000.指针是一个地址,而指针变量是存放地址的变量。 入门第一栗: 通过指针变量访问整型变量 # inclu...
  • 指针变量和非指针变量的本质区别

    千次阅读 2013-07-17 20:09:37
    指针变量本质上是指一个存储了地址的(一个)变量。因此无论哪种类型的指针,变量占用的地址是固定的,32位CPU则为4bytes,16为CPU则为2bytes。  而变量占用的内存空间直接和变量类型相关,因为变量需要保持和该...
  • 指针变量需要类型的解释

    千次阅读 2019-04-14 17:14:19
    它仅仅表示一个地址,无论什么类型变量,不都是用地址来表示的吗? 首先要明白,两个重要的概念: 1.一个地址能存储一个字节,这个概念极其重要。 2.一个指针永远只能指向一个地址(也就是一个字节),当指向...
  • 结构体的使用:  今天去了坑爹的创新实验课,其实也不是说这个课很水,就是不适合大二的我在数电,模电都没接触的情况下去学习,所以我就对这个课就一头雾水,不过就在我蒙了几个小时...//每个成员都要有类型说明; }
  • 指针变量占用多少字节

    千次阅读 2019-05-19 18:21:24
    我们讲过,指针变量根据“基类型”的不同有 int * 型,float * 型,double * 型,char * 型等 但是我们前面在讲数据类型的时候讲过,int 型变量占用 4 字节,float型变量占用 4 字节,double类型变量占用 8字节,...
  • 指针变量的运算

    千次阅读 2015-08-24 10:42:47
    指针变量的运算  指针变量可以进行某些运算,但其运算的种类是有限的。 它只能进行赋值运算和部分算术运算及关系运算。 1.指针运算符(1)取地址运算符&  取地址运算符&是单目运算符,其结合性为自右至左,其功能...
  • 形式: 类型名 * const 指针变量名 将指针变量声明为const型,这样指针变量始终保持为初值,不能改变,即其指向不能改变 例 #include #include int main() { char cBuff1[100] = "1234"; char cBuff2[100] ...
  • 首先看段代码: int b = 12; int *p = &b; //指针变量p指向变量b printf("%p\n",p);//指针p保存的b的地址 printf("%p\n",&p);//指针变量b本身的地址 char a ='b';... //int类型指针变量p2 指向
  • void指针变量的用法

    千次阅读 2018-02-05 17:40:29
    比如void *P=...; 那么*P表示什么? warning: dereferencing 'void *' pointer ...void*类型定义的指针变量只接收对象的地址,没有对象的类型概念。所以该指针变量是不能直接用 “*指针变量”去访问对象的,只能
  • OC多态-指针变量的强制类型转换

    千次阅读 2015-01-08 22:20:59
    // 指针变量强制类型转换和判断指针变量的实际类型 // // Created by Goddog on 15/1/8. // Copyright (c) 2015年 Goddog. All rights reserved. // /*  1.除了id之外,指针变量只能...
  • 14、OC 指针变量的强制类型转换

    千次阅读 2014-12-08 11:41:20
    指针变量的强制类型转化同基本数据类型的强制类型转化相同,都是使用类型转化符圆括号。 强制类型转换只改变编译时类型,但该变量所指的对象的实际类型并不会发生改变,所以强制类型转换时可能会出错。 int main(int...
  • c语言与指针——(二)指针变量的定义与赋值

    万次阅读 多人点赞 2017-12-14 18:15:52
    由上一节,我们知道了,指针就是地址,而变量的指针就是变量的地址,存放变量地址的变量就是指针变量指针变量可以指向另一个变量,在程序中使用" * "来表示这种指向关系。... 类型标识符 * 指针变量
  • C/C++32位和64位编译器下,各数据类型指针变量分配内存大小。
  • 指向函数的指针变量

    千次阅读 2018-08-14 11:16:23
    类型名 (*指针变量名) (函数参数列表) 3. 注意 : 1) 定义指向函数的指向变量, 并不意味其能指向任何函数, 而是只能指向定义时指向的类型函数 . 2) 若需要用指针调用函数, 必须先使用指针变量指向该函数...
  • 【Object-C】指针变量强制类型转换

    千次阅读 2014-11-30 11:48:06
    除了id类型外,指针变量只能调用它编译时类型的方法。而不能调用它运行时类型的方法,即使它实际所指向的对象包含该方法。如果需要让这个指针变量调用运行时类型的方法,就需要强制类型转换。 #import  int main...
  • 指针变量进行运算

    千次阅读 2018-08-09 11:32:19
    C语言指针变量运算 一、相减运算 偏移量除以指针每次移位的大小。加法运算无意义。 二、关系运算 两指针变量进行关系运算可表示所指对象的关系: pf1 == pf2; //pf1和pf2指向同一元素。 pf1 &gt; pf2; //...
  • 只要是指针,要使用它前就必须保证指针变量的值是一个有效的值 ;否则,它指向的内存一定是垃圾数据!  C语言指针一般在什么时候需要申请内存空间 C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 689,194
精华内容 275,677
关键字:

不同类型的指针变量