首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)

&const_variable, 那么不做任何操作; const 修饰数组 : 1.只读数组 : const 修饰数组, 这个数组是只读, 数组每个元素都是只读, 不能作为左值; 2.const...指针指向数据为常量***, 指向数据不可改变; >**右指** : ***const 出现在 * 右边, 指针地址本身是常量***, 指针地址不可改变; const 修饰函数参数 和 返回值...关键字 代码示例 ( 修饰指针 | 错误示例 ) const 修饰指针规则 : 左数右指; 左数 : const 出现在 * 左边, 指针指向数据为常量, 指向数据不可改变; 右指 : const...0,其地址错位1. ---- (3) struct 结构体实现柔性数组 柔性数组 : 1.普通数组 : 在定义时候定义数组大小,并且在栈上分配内存; 2.柔性数组 : 数组大小未知,定义完之后可设置数组大小...array[] 是一个未知大小数组, 编译器不知道该数组多大, 就将该数组大小当做0 //sizeof 计算 结构体 4 个字节是 int 类型大小, 后面的 int array[] 只是占位符

2.3K20

万字长文【C++】高质量编程指南

const常量完全可以取代宏常量。 (1)不能再类声明中初始化 const数据成员,因为类对象未被创建编译器不知道 SIZE值是多少。...class A { //错误,在类声明中初始化const数据成员 const int SIZE = 100; //错误,未知SIZE int array[SIZE]; }; (2)const...枚举常量不会占用对象存储空间,它们在编译被全部求值,其缺点是:它隐含数据类型是整数,其最大值有限,且不能表示浮点数。...*),而不是p所指内存容量 //当数组作为函数参数进行传递,该数组自动退化为同类型指针 void Func(char a[100]) { sizeof(a);//4 而不是100 } 8.2.4...a = b) = c; // 不正常链式赋值,但合法 成员函数 8,任何不会修改数据成员函数都应该声明为const类型,如果在编写const成员函数,不慎修改了数据成员,或者调用了其他非const

1.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

【读书笔记】读《程序员面试宝典》

答:C++语言可以使用const定义常量,也可以使用#define定义常量,但是前者比后者有更多优点:      *const常量有数据类型,而宏常量没有数据类型。...(8)当使用了一个结构类型或者变量,sizeof返回实际大小。当使用一静态空间数组,sizeof返回全部数组尺寸。sizeof操作符不能返回被动态分配数组或者是外部数组尺寸。     ...(9)数组作为参数传给函数时候,传递是指针而不是数组,传递数组首地址,如func(char [8])、func(char [])都等价于func(char *)。...不完全类型指具有位置存储大小数据类型,如未知存储大小数组类型、未知内容联合或者结构、void类型等。   (3)const成员函数是什么?   ...如果把不改变数据成员函数都加上const关键字进行标识,显然可以提高程序可读性。其实,它还能提高程序可靠性,已定义成const成员函数,一旦企图修改数据成员值,则编译器按错误处理。

80420

C++20新特性个人总结

2.24  new表达式数组元素个数推导  2.25  unicode字符串字面量  2.26  允许转换成未知边界数组  2.27  聚合初始化推导类模板参数  2.28  隐式地将返回本地变量转换为右值引用...thread_local修饰变量可不进行初始化  例子:  const char * get_str1() {     return "111111"; } constexpr const char...const char *str3 = hahah; // 编译错误,用非常量表达式对constinit变量进行初始化 int main() {     static constinit const char...    constinit thread_local const char *str6; // 编译正确     return 0; }  2  语法  2.1  位域变量默认成员初始化  位域变量在声明时可进行初始化...  这个特性比较简单,在实参为数组传参形参可以是无边界数组

1.8K50

第6章 函数

这样的话,如果在头文件中实现了某个函数,而该函数又被多个源文件使用,那么在编译正常,而在链接就会报错,某些函数多次重复定义。...这是因为每个源文件都会对自己使用函数进行编译编译 .obj中已经包括了该函数定义,而在后续多个 .obj文件链接,才发现这个函数被多次定义了。...当然,还可以通过自定义一个数据类型或使用 tuple模板来返回多个值。 与变量初始化一样,参数初始化时,会忽略掉顶层 const。因此对下式传给它常量对象或者非常量对象都是可以。...数组不允许拷贝,所以无法以值传递形式传递数组参数;使用数组通常会将其转换成指针,所以当为函数传递一个数组参数,实际传递是指向数组首元素指针。数组大小对函数调用没有影响。...而只要有一个形参在编译期是未知,它就会表现为一个正常函数,在运行期计算它值。

1.2K70

拿捏住C字符串,这个烦人程度不亚于指针小东西

字符串字面量在哪里使用,是否全局、静态、局部,都无所谓。 大部分编译器会将字符串字面量看做常量,无法修改字符串,不过有些编译器会不一样,碧如GCC。...char*类型实体赋值 /*char* test = (char*)malloc(10); test = "qwr";*/ //依旧不行 const char* test = "asdfg"...//可以理解为,将字符串字面量取出遍历,一个一个放进字符数组char test[10]; test = "asdfghjkl"; //报错,表达式必须是可修改左值 //不能把字符串字面量地址赋给数组名字...为了提高代码可移植性,就有必要定义这样数据类型。一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好。...---- strcat:拼接字符串 char* strcat(char* s1,const char* s2); //第一个参数地址必须足够长,不然越界了,就是会有未知风险了 //注意,这些函数参数类型

25810

c++面试选择题_C语言经典笔试题

因此,当参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。...而引用更容易使用,更清晰。 9.在什么时候需要使用“常引用”?  如果既要利用引用提高程序效率,又要保护传递给函数数据不在函数中被改变,就应使用常引用。...被Const修饰东西都受到强制保护,可以预防意外变动,能提高程序健壮性。 1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。...注意当数组作为函数参数进行传递,该数组自动退化为同类型指针。...第26题:const 与 #define 比较 ,const有什么优点? (1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。

1K10

C++经典面试题(最全,面中率最高)

因此,当参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。...被Const修饰东西都受到强制保护,可以预防意外变动,能提高程序健壮性。 1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。...注意当数组作为函数参数进行传递,该数组自动退化为同类型指针。...答案:正确 这个 sizeof是编译时运算符,编译就确定了 ,可以看成和机器有关常量。 25题:引用与指针有什么区别? 【参考答案】 1) 引用必须被初始化,指针不必。...【参考答案】 (1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。

1.1K30

C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案

答案: c++中指针是一个很经典用法,但是也是最容易出错,比如定义了一个指针,必须对其进行初始化,不然这个指针指向是一个未知内存地址,后续对其操作时候,会报错。...存放指针数组char *array[5];含义是一个数组中存放了5个指向字符型数据指针。...按照题意,我理解为初始化一个存放指针数组char *array[2]={“China”,”Beijing”};其含义是初始化了一个有两个指向字符型数据指针数组,这两个指针分别指向字符串”China...存放指针数组char *array[5];含义是一个数组中存放了5个指向字符型数据指针。...按照题意,我理解为初始化一个存放指针数组char *array[2]={“China”,”Beijing”};其含义是初始化了一个有两个指向字符型数据指针数组,这两个指针分别指向字符串”China

1.6K20

精选 30 个 C++ 面试题(含解析)

因此,当参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。...而引用更容易使用,更清晰。 9.在什么时候需要使用“常引用”? 如果既要利用引用提高程序效率,又要保护传递给函数数据不在函数中被改变,就应使用常引用。...被const修饰东西都受到强制保护,可以预防意外变动,能提高程序健壮性。 1)const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。...注意当数组作为函数参数进行传递,该数组自动退化为同类型指针。...在定义该const变量,通常需要对它进行初始化,因为以后就没有机会再去改变它了; (2)对指针来说,可以指定指针本身为const,也可以指定指针所指数据const,或二者同时指定为const; (

49630

【笔记】《C++Primer》—— 第一部分:C++基础

自动推断类型关键字auto会顺便进行变量赋值且会忽视顶层const,所以auto必须要初始化 *和&是属于标识符而不是数据类型,会被auto忽视 只想推导数据类型而不需要赋值,可以使用decltype...可以对指针进行地址加减来移动指针 指针可以使用下标符来取值且下标是可以为负数 c_str()得到char*实际上是string里指针,所以不允许修改 多维数组也就是数组数组,可以使用多层花括号来初始化...需要使用预处理器语句来防止头文件重复引用造成数据重复定义 有些编译器(如vs)支持#progma once语句,但是更通用方法是使用#ifndef NAME配合#endif预处理符,这对符号只看字面意思就能明白其作用机理了...想使用默认构造函数,方法是初始化对象使用后面的调用运算符(即小括号对),如直接写Test a; 当构造函数*只接受一个*实参,称转换构造函数,即定义了这种类型隐式转换机制,在这种情况下我们对实参输入编译器可以自动地进行...,且只能用于直接初始化 一个类所有成员是public,没有构造函数,没有类内初始值且没有基类和虚函数,这个类称为聚合类 数据成员都是字面值常量聚合类或不是聚合类但其成员都是字面值,至少含有一个constexpr

1.4K40

C++基础知识复习

array 数组各个成员连续存储在内存中。8个依次相连邻居。 没指定数值,就是0。 (我发现数组并不能重新对数组整体以{}形式重新赋值。) 特殊写法——定义仅指定部分成员。(乱序方式)。...对象数组初始化列表中,使用对象。 赋值构造函数 ---- 指针——一定要记住开辟空间 new了一定要delete,尽量开辟大一点空间。 返回值要注意连用情况。...name = "未知"; addr = new char[64]; strcpy(addr, "未知"); } Human(const string namedtor,const char...对类静态成员进行初始化 int Human::count =0; 加了const可以直接在类内初始化 所有的成员函数都可以访问静态数据成员。...或者 在类构造函数初始化列表赋值。 在构造函数中初始化const class function member const修饰成员函数不能修改任何数据成员。

51810

C++面试题汇总 (一)

因此,当参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。 ...被Const修饰东西都受到强制保护,可以预防意外变动,能提高程序健壮性。  1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。...注意当数组作为函数参数进行传递,该数组自动退化为同类型指针。 ...答案:正确 这个 sizeof是编译时运算符,编译就确定了 ,可以看成和机器有关常量。  题:引用与指针有什么区别?  【参考答案】   引用必须被初始化,指针不必。 ...【参考答案】  (1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。

81820

《逆袭进大厂》之C++篇49问49答(绝对干货)

6、基类虚函数表存放在内存什么区,虚表指针vptr初始化时间 首先整理一下虚函数表特征: 虚函数表是全局共享元素,即全局仅有一个,在编译就构造完成 虚函数表类似一个数组,类对象中存储vptr...所有不加static全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在编译模块中使用 默认初始化为0,包括未初始化全局静态变量与局部静态变量,都存在全局未初始化区 静态变量在函数内定义...(const int& i){ //... } 考虑类情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员值可以不同...当拷贝构造函数为private:语句3和语句4在编译时会报错 使用explicit修饰构造函数:如果构造函数存在隐式转换,编译时会报错 C++直接初始化与复制初始化区别:https://blog.csdn.net...(1)volatile volatile 关键字是一种类型修饰符,用它声明类型变量表示可以被某些编译未知因素更改,比如:操作系统、硬件或者其它线程等。

2.5K40

《逆袭进大厂》之C++篇49问49答

6、基类虚函数表存放在内存什么区,虚表指针vptr初始化时间 首先整理一下虚函数表特征: 虚函数表是全局共享元素,即全局仅有一个,在编译就构造完成 虚函数表类似一个数组,类对象中存储vptr...所有不加static全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在编译模块中使用 默认初始化为0,包括未初始化全局静态变量与局部静态变量,都存在全局未初始化区 静态变量在函数内定义...不考虑类情况 const常量在定义必须初始化,之后无法更改 const形参可以接收const和非const类型实参,例如 考虑类情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化...当拷贝构造函数为private:语句3和语句4在编译时会报错 使用explicit修饰构造函数:如果构造函数存在隐式转换,编译时会报错 C++直接初始化与复制初始化区别:https://blog.csdn.net...(1)volatile volatile 关键字是一种类型修饰符,用它声明类型变量表示可以被某些编译未知因素更改,比如:操作系统、硬件或者其它线程等。

1.9K10

面向对象之this指针与类中枚举类型

const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变,因为类可以创建多个对象,不同对象其 const 数据成员值可以不同。 不能在类声明中初始化 const 数据成员。...以下用法是错误,因为类对象未被创建编译器不知道 SIZE 值是什么。...(c++11标准前) class A { const int SIZE = 100; // 错误,企图在类声明中初始化 const 数据成员 int array[SIZE]; // 错误...,未知 SIZE }; 正确应该在类构造函数初始化列表中进行: class A { A(int size); // 构造函数 const int SIZE ; };...枚举常量不会占用对象存储空间,它们在编译被全部求值。 枚举常量缺点是:它隐含数据类型是整数,其最大值有限,且不能表示浮点。

1.1K10

C Primer Plus(七)

// We, 0x100000f61, c return 0; } 字符串数组初始化 定义字符串数组,必须让编译器知道需要多少空间。..."; 这种形式初始化比标准数组初始化形式简单得多: const char m1[40] = { 'L', 'i', 'm', 'i', 't', ' '...为了容纳空字符,在指定数组大小时,要确保数组元素个数至少比字符串长度多 1。所有未被使用元素都被自动初始化为 0(即空字符,不是数字字符 0)。 通常,让编译器确定数组大小很方便。...前面介绍过,省略数组初始化声明中大小,编译器会自动计算数组大小: const char m2[] = "If you can't think of anything, fake it...."; 让编译器确定初始化字符数组大小很合理。因为处理字符串函数通常都不知道数组大小,这些函数通过查找字符串末尾空字符确定字符串在何处结束。 让编译器计算数组大小只能用在初始化数组

63010

深入解析C++auto自动类型推导

expr是初始化列表 当expr是一个初始化列表,分为两种情况而定: auto var = {}; // (1) // 或者 auto var{}; // (2) 当使用第一种方式,var将被推导为...expr是数组或者函数 数组在某些情况会退化成一个指向数组首元素指针,但其实数组类型和指针类型并不相同,如下定义: const char name[] = "My Name"; const char...* str = name; 数组name类型是const char[8],而str类型为const char*,在某些语义下它们可以互换,如在第一种规则下,expr是数组数组将退化为指针类型,如下...使用auto好处 强制初始化作用 当你定义一个变量,可以这样写: int i; 这样写编译是能够通过,但是却有安全隐患,比如在局部代码中定义了这个变量,然后又接着使用它了,可能面临未初始化风险...类内初始化成员不能使用auto 在C++11标准中已经支持了在类内初始化数据成员,也就是说在定义类,可以直接在类内声明数据成员地方直接写上它们初始值,但是在这个情况下不能使用auto来声明非静态数据成员

11820

C++:数组与多维数组

//列表初始化成功 char c3[] = "c";                             //自动添加' /0 '到尾部   const char c4[6] = "abcdef";...注意:使用这种操作,需要带上头文件,当解引用和递增尾后元素时候,编译器出错,与迭代器失效类似。 ...const char ca1[] = "one"; const char ca2[] = "two"; if(ca1 < ca2)                //未定义,试图比较两个无关地址 //...s = s + "s"; const char *str = s.cstr();  (2)使用数组初始化vector对象  我们不可以拿一个数组为另一个内置类型(最原始数组char [])数组赋初值也不运行使用...(4)指针和多维数组  当程序使用多维数组名字,也会自动将其转换成指向数组首元素指针。

1.9K30

『C++』我想学C++,C++太难了,那我想入门,给我10分钟我带你入门

自动转换发生在不同数据类型运算,在编译时候自动完成。 char类型数据转换为int类型数据遵循ASCII码中对应值....其一般形式为: (数据类型) (表达式) 其作用是把表达式运算结果强制转换成类型说明符所表示类型 在使用强制转换应注意以下问题: 数据类型和表达式都必须加括号, 如把(int)(x/2+y)写成...另外针对操作次数已经,建议使用计数循环方式。 如果操作次数未知,要求达到指定目标才停止,就采用条件循环。 很多函数大都是循环体。...存储类别 static静态存储 static对象在控制流程第一次到达其定义点初始化,如果没有提供初始值就被自动初始化为0; 在函数后续调用中,初始化语句被跳过 静态对象值在函数被多次调用之间保持有效...,生存期会延续到整个程序结束但他作用于仍然是局部,因此需要在同一函数两次调用之间保留某些数据可以使用局部static对象。

1.5K10
领券