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

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

( 被赋值 [ 左值 ] 时可以被赋值为任意指针类型变量 | 右值 赋值给其它类型变量时 需要将 void* 指针强转为被赋值的类型 ) (3) void * 指针 代码示例 ( 实现 memset...这里将错误代码注释掉..... ---- (2) void * 指针介绍 ( 被赋值 [ 左值 ] 时可以被赋值为任意指针类型变量 | 右值 赋值给其它类型变量时 需要将 void* 指针强转为被赋值的类型 ) void *...指针指向的数据为常量***, 指向的数据不可改变; >**右指** : ***const 出现在 * 右边时, 指针地址本身是常量***, 指针地址不可改变; const 修饰函数参数 和 返回值...关键字 代码示例 ( 修饰指针 | 错误示例 ) const 修饰指针规则 : 左数右指; 左数 : const 出现在 * 左边时, 指针指向的数据为常量, 指向的数据不可改变; 右指 : const

2.4K20

【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值

1.7.2 引用与指针不同点 引用概念上定义一个变量的别名,指针存储一个变量地址 引用在定义时必须初始化,指针没有要求 引用在初始化引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体...推荐内敛函数的声明和定义放在一块,在头文件展开并且链接时不会出现命名冲突 【推荐】: 如果是大函数,可以使用声明和定义分离,static修饰; 如果是小函数,可以使用内敛。...使用(自动识别类型) auto定义变量 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。...因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型 指针和引用结合起来使用 auto与指针和引用结合起来使用。...当auto声明指针类型时,用auto和auto没有任何区别(**如果使用auto ,则表示指向的变量是指针类型**)但用auto声明引用类型时,则必须加& int main() { int x

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

    C++第二弹 -- C++基础语法下(引用 内联函数 auto关键字 范围for 指针空值)

    类型转换和表达式传引用的注意事项 上篇我们讲过, 传引用时, 权限等于或者缩小, 但是权限不能放大 类型转换 如下面这个例子, 将浮点型数据赋值给整型变量, 在d赋值给i时, 需要借助临时变量, 用临时变量存储转换后的值...使用引用可以直接访问对象,而不需要通过解引用符号(*)来获取指针所指向的对象。 引用可以避免指针操作中可能出现的空指针问题,减少了程序出错的概率。...编译器可能会发出警告信息,因为声明一个const指针而没有初始化它通常是一个错误。...3. auto的使用细则 auto与指针和引用结合起来使用用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& int main() { int x =...指针空值nullptr(C++11) 1.C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。

    11110

    高级指针话题-函数指针

    nm testFun |grep test #查看test函数的符号表信息 0000000000400526 T test 如何声明函数指针 声明普通类型指针时,需要指明指针所指向的数据类型,而声明函数指针时...typedef的使用不在本文的讨论范围,但是特别强调一句,typedef中声明的类型在变量名的位置出现,理解了这一句,也就很容易使用typedef了。...因而下面的方式是错误的: typedef myFun (int)(int,int); //错误 typedef (int)(int,int) *myFun; //错误 为函数指针赋值 赋值也很简单...函数名在被使用时总是由编译器把它转换为函数指针。 要想声明函数指针,只需写出函数原型,然后将函数名用(*fp)代替即可。这里fp是声明的函数指针变量。...typedef中声明的类型在变量名的位置出现。 思考 下面的声明如何理解 void (*signal(int sig, void(*func)(int)))(int);

    70510

    告诉你所不知道的typedef

    定义易于记忆的类型名typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。...2. typedef & 结构的问题当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?...定义易于记忆的类型名typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。...2. typedef & 结构的问题当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?...2. typedef & 结构的问题当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?

    93410

    List类的超详细解析!(超2w+字)

    既然没有实例化,那编译器也不知道这个 iterator 的类型是什么,typedef 一下没什么问题。...vector、string 的迭代器怎么适配? 这里在取内嵌类型,只有自定义类型才能在里面搞内嵌类型,内嵌类型也是类,typedef也是内嵌类型。如果是一个原生指针呢? 原生指针哪来的内嵌类型?...注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的一个类型,而不是静态成员变量 // 否则编译器编译时就不知道Ref是Iterator中的类型还是静态成员变量...但是这里就出现了问题,那就是拷贝构造或者赋值的浅拷贝问题引发的析构问题:浅拷贝只是将指针拷贝过去,两个 list 指向的是同一块空间,最后释放的时候,同一块空间被析构了两次,这样子程序就报错了!...{ public: // 注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的一个类型,而不是静态成员变量 // 否则编译器编译时就不知道Ref是Iterator

    77630

    C++从入门到精通——this指针

    : 语法错误:如果代码中包含了错误的语法,编译器将无法解析代码并报错。...例如,缺少括号、缺少分号、错误的变量命名等。 类型错误:如果代码中使用了错误的类型或进行了不兼容的类型转换,编译器将报错。例如,将字符串赋值给整数类型的变量、使用未声明的变量等。...缺少依赖库:如果代码中使用了某个依赖库,但没有将其正确导入或链接到项目中,编译器将无法找到该库并报错。 重复定义:如果代码中定义了重复的变量、函数或类型等,编译器将报错。...当编译报错时,通常会提供详细的错误信息,其中包含了错误的位置和具体原因,开发人员可以根据这些信息来定位和修复错误。 什么时候会出现运行崩溃 运行崩溃是指在程序运行过程中突然停止或无响应的情况。...在C++中,this指针指向当前对象的地址,如果对象不存在,即为空,this指针也将为空。在访问对象的成员函数时,需要先判断this指针是否为空,以避免访问空指针错误。

    1.7K10

    List类

    2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。...last) 用[first, last)区间中的元素构造list 1.2.2 list iterator的使用 此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。...1.2.6 list的迭代器失效 前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。...template class ReverseListIterator { // 注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的类型,而不是静态成员变量...// 否则编译器编译时就不知道Ref是Iterator中的类型还是静态成员变量 // 因为静态成员变量也是按照 类名::静态成员变量名 的方式访问的 public: typedef typename

    5810

    C语言三剑客之《C专家编程》一书精华提炼

    首先,可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名称不能这样做。typedef int banana; unsigned banana i; /*错误!...非法 */;其次连续几个变量声明。 ----由于typedef由编译器解释的,而宏是由预处理器解释的 typedef void (*ptr_to_func)(int);//这样来定义函数指针的别名。...----目前linux好像不出现错误 段错误是由于MMU(内存管理单元,负责支持虚拟内存的硬件)的异常所致,而该异常通常是由于解除引用(查看指针所指地址的内容)一个未初始化或非法值的指针引起的。...在函数参数的声明中,数组名被编译器当作指向该数组的第一个元素的指针----这里数组是指一维数组 指针有类型限制,是因为编译器需要知道对指针进行解除引用时应该取几个字节,以及每个下标的步长。...----此处括号是必须的,因为[]的优先级比*高 Iliffe向量,创建一个一维数组,数组中的元素是指向其他东西的指针。

    2.4K50

    (超级清晰带图版)STL--list--C++

    用[first, last)区间中的元素构造list list的构造使用代码演示 4、list iterator的使用 此处,可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。...8、list的迭代器失效 前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。...因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。...template class ReverseListIterator { // 注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的类型,而不是静态成员变量...// 否则编译器编译时就不知道Ref是Iterator中的类型还是静态成员变量 // 因为静态成员变量也是按照 类名::静态成员变量名 的方式访问的 public: typedef typename

    4100

    江哥带你玩转C语言 | 15- 修饰符和预处理指令

    ; 指针 typedef与指向结构体的指针 // 定义一个结构体并起别名 typedef struct { float x; float y; } Point; /...// 定义一个指向sum函数的指针变量p MySum p = sum; ---- 宏定义与函数以及typedef区别 与函数的区别 从整个使用过程可以发现,带参数的宏定义,在源程序中出现的形式与函数很像...这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后 int const x=2; 或 const int x=2; (当然,我们可以偷梁换柱进行更新: 通过强制类型转换,将地址赋给变量...利用指针指向变量 int *p; p = &a; // 利用指针间接修改变量中的值 *p = 10; printf("%d\n", a); printf...Fun(const int Var); 告诉编译器Var在函数体中的无法改变,从而防止了使用者的一些无 意的或错误的修改。

    1.1K00

    编码之旅:C++的基础韵律

    函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。...引用在初始化时,引用⼀个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。 4. 引用可以直接访问指向对象,指针需要解引用才是访问指向对象。...5. sizeof()中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。 6. 指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些。...4. inline修饰函数时不建议声明和定义分离到两个文件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。...3. nullptr提供了一种更安全、更清晰的方式来表示空指针,有助于减少错误并提高代码的可读性和安全性。

    7900

    探秘 C++ list:在复杂数据管理的编程世界里,它宛如灵动的魔法链条,高效实现元素频繁增删,有序维系数据秩序,无论是海量动态数据缓存、游戏角色属性集处理,还是复杂任务调度编排

    我们可以看到清空了 list的迭代器失效 前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无 效,即该节点被删除了。...因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入 时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭 代器,其他迭代器不会受到影响。...template class ReverseListIterator { // 注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的类型,而不是静态成员变量...// 否则编译器编译时就不知道Ref是Iterator中的类型还是静态成员变量 // 因为静态成员变量也是按照 类名::静态成员变量名 的方式访问的 public: typedef typename...对原生态指针(节点指针)进行 封装 迭 代 器 失 效 在插入元素时,要给所有的迭代器重新赋值,因为 插入元素有可能会导致重新扩容,致使原来迭代器 失效,删除时,当前迭代器需要重新赋值否则会失 效 插入元素不会导致迭代器失

    6810

    【C++修行之道】引用、内联函数、auto关键字、for循环(C++)、nullptr(C++11)

    引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小...因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编 译期会将auto替换为变量实际的类型 3.3 auto的使用细则 1. auto与指针和引用结合起来使用 用auto...声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须 加& int main() { int x = 10; auto a1 = x; auto a2 = &x...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...,否则可能会出现 不可预料的错误,比如未初始化的指针。

    6100

    c语言typedef的四种用法

    但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针? 从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?...莫非 C 语言不允许在结构中包含指向它自己的指针?...于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode,因为这个结构体类型的新别名还不存在,所以自然就会报错。...因此,我们要做一些适当的调整,比如将结构体中的 pNext 声明修改成如下方式: typedef struct tagNode { char *pItem; struct tagNode...]; INT_ARRAY_100 arr; 这个在大学时期用过,所以我相信读者也应该可以很简单的理解 4.为指针定义简洁的类型名称 typedef char* PCHAR; PCHAR pa; 在比较复杂的变量声明中

    50820

    二、从C语言到C++(二)

    然而,在C++中,直接将 NULL 定义为 (void*)0 可能会导致类型安全的问题,因为当你尝试将一个 void* 类型的值赋给一个非 void* 类型的指针时,编译器可能会发出警告或错误。...= nullptr; 注意:在C++中,如果你尝试将 nullptr 赋值给一个非指针类型的变量,编译器会报错,这有助于在编译时捕获潜在的错误。...但在处理C语言代码或需要与C语言交互时,可能仍然需要使用typedef。 void* 万能指针 在C和C++中,void* 被称为“万能指针”或“通用指针”,因为它可以指向任何数据类型的对象。...注意事项 使用 void* 时需要特别小心,因为编译器不会为你检查类型安全性。如果你错误地将一个 void* 转换为错误的类型并解引用它,可能会导致未定义的行为。...以下是一些主要的区别: 作用域: 在C语言中,const变量默认具有文件作用域(除非在函数内部声明),并且如果在一个头文件中声明了const变量,那么在包含该头文件的多个源文件中会出现重复定义的错误

    7310

    一篇读懂 C 指针

    在编译后生成的机器代码中,变量名被替换为相应的内存地址,变量名本身不会出现在最终的机器代码中。为了调试方便,编译器在生成可执行文件时可以选择保留符号信息(使用 -g 选项)。...当变量名出现在赋值语句的左边时,它代表一个内存地址,称为左值;出现在右边时,它代表内存地址中的内容,称为右值。...1 2 char *str; str = "abc"; // 将指向"abc"初始元素的指针赋值给 str 当用字符串字面量来初始化 char 数组时,编译器会进行特殊处理。...可以通过传递指向数组首元素的指针来实现。 在函数形参的声明中,编译器会将数组的形式自动改写为指向数组第一个元素的指针。编译器实际上只会将数组的地址传递给函数,而不是传递整个数组的副本。...来看下面的函数声明: 1 void func(int a[][4]) 在这里,a 的类型是“int 的数组的数组”,但由于它是函数形参,编译器会将其解读为“指向一个长度为 4 的 int 数组的指针”

    13510

    指针进阶(3)(超详细)

    /int *代表是一种数据类型,int*指针类型,p才是变量名 //定义了一个指针类型的变量,可以指向一个int类型变量的地址 int *p; p = &a;//将a的地址赋值给变量...通常情况下,signal函数用于设置信号处理函数,以便在接收到特定信号时执行相应的操作。 2.4 typedef 关键字 本科学过C语言的朋友都知道数据类型的概念。...typedef char int8; int8 a1; 2.简化复杂的类型声明:typedef 可以简化复杂的类型声明,使得类型声明更加简洁明了。...例如,下面的语句将一个指向函数的指针类型定义为 FUNC_PTR: typedef int (*FUNC_PTR)(int, int); 然后就可以在程序中使用 FUNC_PTR 来代替这个复杂的类型声明...使用 typedef 定义一个新的类型名称,可以确保该类型在不同的编译器上都具有相同的长度和语义。

    7010

    【C++ 初阶】内联 auto&范围for循环&指针空值

    return 0; } 在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的 类型。...因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。...2.3 auto的使用细则 1. auto与指针和引用结合起来 使用用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& ​ 2....} 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...指针空值nullptr(C++11) C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针。

    10510
    领券