区别_区别 指标 标签 - CSDN
精华内容
参与话题
  • int (*p)[4]; int *q[4];区别

    千次阅读 2018-01-10 21:23:30
    定义涉及两个运算符:“*”(间接引用)、“[]”(下标),“[]”的优先级别大于“*”的优先级别。...int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便)

    定义涉及两个运算符:“*”(间接引用)、“[]”(下标),“[]”的优先级别大于“*”的优先级别。

      首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4];剩下的“int *”作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便)



        再看int (*q)[4]。它首先是个指针,即*q,剩下的“int [4]”作为补充说明,即说明指针q指向一个长度为4的数组。int (*q)[4]的存储结构如下:

    请看以下定义:

    int a[2][4]={{2,5,6,8},{22,55,66,88}};

    int c[4]={5,8,9,4};

    int d[3]={23,12,443};

    int *p[4],(*q)[4];

    q=a;

    *p=c;

    *(p+1)=d;

    则int *p[4]和int (*q)[4]的存储数据为:

    验证:

     

     

     

     

    #include <stdio.h>

    int main(void)

    {

        int a[2][4]={{2,5,6,8},{22,55,66,88}};

        int c[4]={5,8,9,4};

        int d[3]={23,12,443};

        int *p[4],(*q)[4];

        q=a;

        *p=c;

        *(p+1)=d;

        int i,j;

        for(i=0;i<2;i++)

            for(j=0;j<4;j++)

           {

               if((i==1)&&(j==3)) break;

               printf("*(*(p+%d)+%d)=%d\n",i,j,*(*(p+i)+j));

           }

        puts("===============");

        for(i=0;i<2;i++)

           for(j=0;j<4;j++)

               printf("*(*(q+%d)+%d)=%d\n",i,j,*(*(q+i)+j));

       return 0;

    }

     

    输出结果为:

    *(*(p+0)+0)=5

    *(*(p+0)+1)=8

    *(*(p+0)+2)=9

    *(*(p+0)+3)=4

    *(*(p+1)+0)=23

    *(*(p+1)+1)=12

    *(*(p+1)+2)=443

    ===============

    *(*(q+0)+0)=2

    *(*(q+0)+1)=5

    *(*(q+0)+2)=6

    *(*(q+0)+3)=8

    *(*(q+1)+0)=22

    *(*(q+1)+1)=55

    *(*(q+1)+2)=66

    *(*(q+1)+3)=88

    展开全文
  • #define宏定义和const及enum枚举的区别

    千次阅读 2017-10-06 19:03:06
    #define p 10 const int p=10; enum p {a; ...a和b成为枚举元素或者枚举常量,编译器会对他们按定义的顺序赋值为1,2,3,........ ...但是不能对枚举变量直接赋予一个整值,必须进行类型强转才能赋。...

    #define p 10

    const int p=10;

    enum p

    {a;

    b;

    }k;

    enum简单扩展:

    a和b成为枚举元素或者枚举常量,编译器会对他们按定义的顺序赋值为1,2,3,........

    k为枚举变量,它的值是可以输出的。但是不能对枚举变量直接赋予一个整值,必须进行类型强转才能赋。

    例如k=(p)2;这个语句的意思是将枚举元素顺序号为2的元素赋值给k,相当于k=b;


    (1)编译器处理方式不同

    #define是在预处理阶段对所定义的常量进行替换展开;

    const是在编译运行阶段使用;

    enum是程序运行时起作用;


    (2)分配内存不同

    #define宏定义仅仅是替换和展开,并不进行内存的分配(宏定义不分配内存,常量的定义分配内存);

    const常量编译器会分配内存,在堆或者栈;

    enum常量存储在内存数据段的静态存储区。

    延伸:在C语言里,const的含义是被称为一个不能被改变的普通变量,而在C++中其含义就不尽相同。C++中的const常量,C++编译器都会尽量避免const 常量的内存分配,只有当不得已的时候才会分配具体的内存空间给const变量。

    例子

    (1)

    由反汇编代码看出j的值是从a的内存空间中取出值赋给j的存储空间;

    (2)


    由const定义的常变量的值是直接赋给j的存储空间,而不对其值进行存储,放在常量表中或是直接使用其值。

    (3)类型检查

    #define宏定义没有类型检查和安全检查,所以会导致边际效应,出现不可预知的错误;

    const在编译阶段进行类型检查和安全检查;

    enum在编译阶段进行类型检查,但是只能进行整形的定义;












    展开全文
  • define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者数字。...

    define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者数字。

    ①被定义为“宏”的标识符称为“宏名”。在编译处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替代,这称为“宏代替”。宏定义是由源程序中的宏定义命令完成的。宏代替是由预处理程序自动完成的。而宏定义的作用范围仅限于当前文件。

    ②宏定义有几个优点:一、方便程序的修改  使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可。二、提高计算机的运行效率   使用带参数的宏定义可以完成函数调动的功能,又能减少系统开销,提高运行效率。

    ③对于宏定义还有几点说明:一、宏定义是用宏名来表示一个字符串,在宏展开时又是以该字符串取代宏名,者之死一种简单的替换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序不会对它作检查。如果有错误,只能在编译已经被宏展开后的源程序时发现。二、宏定义不是说明或者语句,在行末不必增加分号,如加上分号则连分号也一起置换。三、宏定义其作用域为宏定义命令起到源程序结束。如果终止其作用域可使用#undef命令。

    const,它是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。关于const的用法总结以下几点:

    ①函数体内修饰局部变量

    例:void main()

    {

          const int a=0;

    }

    const作为一个类型限定词,和int有着相同的地位。const int a;//int const a;是等价的。于是在此处我们应该知道const修饰的对象是谁,是a,和int没关系。const要求他的对象为常量,不可被改变,不可被赋值,不可为左值。

    ②在函数声明时修饰参数

    根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

    1、防止修改指针指向的内容

    void StringCopy(char *strDestination, const char *strSource);
    其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。

    2、防止修改指针指向的地址

    void swap ( int * const p1 , int * const p2 )
    指针p1和指针p2指向的地址都不能修改。

    3、以上两种的结合。

    ③修饰函数的返回值

    如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
    例:

    const char * GetString(void);
    如下语句将出现编译错误:

    char *str = GetString();
    正确的用法是

    const char *str = GetString();

    ④全局变量

    使用extern(extern是计算机语言中的一个函数,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。)

    例:extern const double pi;

          const double pi=3.14;

    然后其他需要使用pi这个变量的,包含file1.h   #include "file.h"或者复制声明。 

    const 的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的作用就是让更多的逻辑错误在编译期被发现。

    enum,枚举类型是一种基本数据类型,定义一般为:enum 枚举名{枚举值表};在枚举值表中应罗列出所有可用值。这些值也被称为枚举元素。

    ①枚举的定义,枚举值是常量,不是变量。不能再程序中用赋值语句在对它赋值。

    第一种定义为:

    enum box{pencil,pen};  

    enum box box2;//或者简写成box box2;  

    再有一种就是在声明的时候同时定义。

    enum {pencil,pen}box,box2; //在声明的同时进行定义!

    如果直接enum box{pencil=3,pen};};//这里pen就是4系统将自动进行pen=4的定义赋值操作。

    又如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作

    ②枚举元素本身由系统定义了一个表示序号的值,从0开始顺序定义为0,1,2,,,。如在weekday中,sun值为0,mon值为1,…,sat值为6。

    例:void   main()

    {
             enum weekday{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
             a=sun;
             b=mon;
             c=tue;
             printf("%d,%d,%d",a,b,c);
    }

    说明:
    只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
    a=sum;
    b=mon;
    是正确的。而:
    a=0;
    b=1;
    是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
    如:
    a=(enum weekday)2;
    其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:
    a=tue;
    还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。



    展开全文
  • 区别#define、enum和const

    2018-07-31 21:50:59
    1.#define 宏常量实在预编译阶段进行简单的替换,枚举常量是在编译器确定其值;  2.一般在编译器里面,可以调试枚举常量,但是不可以调试常量;  3.枚举可以一次性定义大量的相关的常量,而宏一次只... ... 4.... 5....

         1.#define 宏常量实在预编译阶段进行简单的替换,枚举常量是在编译器确定其值;

         2.一般在编译器里面,可以调试枚举常量,但是不可以调试常量;

         3.枚举可以一次性定义大量的相关的常量,而宏一次只定义一个;

         4.枚举常量具有类型,但是宏没有类型,枚举常量具有与普通变量相同的诸如作用域、值等性质,但宏没有。

         5.宏定义不是说明或语句,在行末不必加分号。

         6.宏定义其作用域为宏定义命令起到源程序结束。如要结束其作用可使用#under命令。

         7.枚举的优点;自动赋值,调试器在检验其枚举变量时,可以显示其符号值,带有类型归属和类型的检测。宏指事件的替换,不会做检查。

         8.const是修饰,它可以指定任意类型的数据为常量,比如:const float PI =3.1416;enum是类型定义,可以用这个类型来定义变量,而且变量的取值范围理论上应该只在enum指定的常量值中去取。enum定义常量,常量本身只能是整型值。 

             一、  #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
    该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
    (1) 简单的宏定义:
    #define <宏名>   <字符串>
    例: #define PI 3.1415926
    (2) 带参数的宏定义
    #define <宏名> ( <参数表>) <宏体>
    例: #define A(x) x
    一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。

            二、  枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
    1. 枚举的定义
    枚举类型定义的一般形式为:
    enum 枚举名{ 枚举值表 };
    在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
    例如:
    该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。
    2. 枚举变量的说明
    如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明
    设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:
    enum weekday{ sun,mou,tue,wed,thu,fri,sat };
    enum weekday a,b,c;
    或者为: enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
    或者为: enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
      枚举类型在使用中有以下规定:
    1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。 例如对枚举weekday的元素再作以下赋值: sun=5; mon=2; sun=mon; 都是错误的。
    2. 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6。

             三、 const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

    const关键字**
        修饰全局变量:C/C++略有不同,在上文已经提到,即C++的const修
        饰的全局变量可以作为属组的初始化的大小,而C不可以;同时变量的
        值不能被修改;C++利用const的这一属性,代替C中的define进行
        全局常量的定义;

        修饰局部变量:代表局部变量的值不能被修改;
        修饰指针:这个是经常问道的,我举的例子可能不全面,但是是比较
        常见的例子:

        cons t int *p;  //修饰的是p所指向的内容不能被改变,p可
        以;

        int const *p;  //和上面是一样的;

        int* const p;  //修饰的p指针不能改变;

        修饰类的成员变量:必须在初始化列表初始化,除此之外,必须在初
        始化列表初始化的还有,引用类型的数据成员,没有默认构造函数的
        对象成员,如果存在继承关系,如果父类没有默认的构造函数,则也
        必须在初始化列表中被初始化,初始化列表对数据成员的初始化顺序
        是按照数据成员的声明顺序严格执行的;

        修饰类的成员函数:一般放在成员函数的最后面,修饰的是类的成员
        函数中的隐藏参数this指针,代表不可以通过this指针修改类的数据
        成员,声明形式例如:

        Base::void fun() const;

        关于const还有一个问题就是传参和赋值的问题,一般来说,const
        修饰的变量是安全的,没有const修饰的变量是不安全的,一般在传
        参的时候,非const修饰的的变量可以传给const修饰的,而const
        修饰的不可以传给非const修饰的形参,这就相当于把安全的东西交
        给了不安全的人;而赋值的话更不用说了,const修饰的不可以传给
        没有const修饰的变量;

      

    展开全文
  • #defind 宏定义函数 和 inline 函数的区别: 宏看起来像函数,但不会招致函数调用带了的额外开销。 1.inline函数可运行调式,宏定义函数不能调试 2.inline函数进行参数类型安全检查,宏定义不可以 3.宏定义...
  • #define 替换 在程序中扩展#define定义符号和宏时,需要涉及几个步骤。 在调用宏时,首先对参数进行行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。 替换文本随后被插⼊入到程序中原来...
  • ../和./和/的区别

    千次阅读 2018-04-10 14:43:22
    ./ 当前目录../ 父级目录/ 根目录 ./SRC/ 这样写表示,当前目录中的SRC文件夹;  ../SRC/ 这样写表示,当前目录的上一层目录中SRC文件夹; /SRC/ 这样写表示,项目根目录(可以指磁盘根目录,也可以指项目根目录,...
  • ./和../的区别

    千次阅读 2017-10-09 00:09:28
    ./ 当前目录 ../ 父级目录
  • 아 / 어/여서与고 的区别

    千次阅读 2010-09-11 13:31:00
    连接词尾:ㅡ아 / 어/여서 前面不能加时制词尾。 1)用于动词,表示前一动作是后一动作的情态,这时前一动作与后一动作同时进行或前一动作虽已完了,但所形成的状态在进行后一动作时仍保持着。...
  • MyISAM与InnoDB 的区别(9个不同点)

    万次阅读 多人点赞 2019-12-24 16:27:38
    区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务; 2. InnoDB支持外键,而MyISAM不...
  • vector中resize()和reserve()区别

    万次阅读 多人点赞 2013-07-03 11:01:20
    先看看《C++ Primer》中对resize()函数两种用法的介绍: 1、resize(n)  调整容器的长度大小,使其能容纳n个元素。 如果n小于容器的当前的size,则删除多出来的元素。 否则,添加采用值初始化的元素。...
  • EXCEL中 xls 与xlsx 的区别

    万次阅读 2018-11-08 13:49:47
    现在还有很多人在用 Excel 2003 版本,即 xls 格式,那么 xls 和 xlsx 有什么区别呢? xls 是一个特有的二进制格式,其核心结构是复合文档类型的结构,而 xlsx 的核心结构是 XML 类型的结构,采用的是基于 XML ...
  • Spring Boot和Spring Cloud的区别

    万次阅读 多人点赞 2018-12-13 16:04:42
    1、Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的云应用开发工具; 2、Spring boot专注于快速、方便集成的单个个体,Spring ...
  • forward和redirect的区别是什么?

    万次阅读 多人点赞 2020-06-28 16:07:42
    两者的区别总结:1.从地址栏显示来说:1)forword是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。2...
  • ${}和#{}的区别

    万次阅读 多人点赞 2016-11-23 14:08:24
    mybatis中${}和#{}区别
  • Java和C++的区别

    万次阅读 多人点赞 2020-09-21 11:20:08
    Java和C++的区别: 1.Java是解释型语言,所谓的解释型语言,就是源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。 2.C++是编译...
  • 面向对象与面向过程的本质的区别

    万次阅读 多人点赞 2020-04-25 22:31:38
    如果你很想搞明白面向对象是什么,面向过程是什么,或者说二者之间的区别是什么,那么就花费一点时间来研读一下这篇博客,你一定会有很大的收获的! 一、面向对象与面向过程的区别 面向过程就是分析出解决问题所...
  • List和Map的区别

    万次阅读 2018-04-14 14:16:18
    List:是存储单列数据的集合,存储的数据是有序并且是可以重复的 Map:存储双列数据的集合,通过键值对存储数据,存储 的数据是无序的,Key值不能重复,value值可以重复...
  • zsh和bash的区别

    万次阅读 2017-06-29 23:38:47
    看了一些资料,总结出来一句话:zsh完美兼容bash,并且有比bash更强大的功能,用起来也比bash更优雅。参考1:Linux服务器上zsh和bash的区别 参考2:使用 zsh 的九个理由 参考3:Zsh和Bash,究竟有何不同 坑很深
  • 进程和线程的主要区别(总结)

    万次阅读 多人点赞 2018-06-13 10:11:52
    根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类...
1 2 3 4 5 ... 20
收藏数 3,399,319
精华内容 1,359,727
关键字:

区别