资讯详情

资讯详情

C语言初学:常见易混淆概念总结

1. 指针数组 vs 数组指针指针数组数组中的每个元素都是指针int *p[5];数组指针一个指针指向一个数组int (*p)[5];//指向一个5个容量的数组记忆方法先看变量名再看紧挨着变量名的符号。2. 常量指针 vs 指针常量两个名字特别容易记反。常量指针通常指指向常量的指针const int *p;不能直接通过 p 修改p可改*p不可改指针常量指针本身是常量int *const p a;p不可改*p可改注意 指向常量的常量指针p和*p均不可改3.函数指针 vs 指针函数指针函数本质是函数只是返回值是一个指针。声明形式 int *func(int a, int b);解读 func 是一个函数接收两个 int 参数返回一个 int * 整型指针。用途常用于返回动态分配的内存、字符串或数组的地址。函数指针本质是指针只是它指向的是一个函数。声明形式 int (*pFunc)(int, int);解读 pFunc 是一个指针指向一个“接收两个 int 、返回 int ”的函数。用途常用于回调函数、函数表跳转表、策略模式等。4.指针变量 vs 指针所指的变量指针变量是什么一个用来存放地址的变量。类型指针类型例如 int * 、 char * 。内容里面存的是另一个变量的内存地址。操作直接写 p 就是操作这个地址本身指针所指的变量是什么指针变量里那个地址真正指向的数据。类型去掉指针后的基础类型例如 int 、 char 。内容就是目标变量本身的值。操作通过 *p 访问 * 表示“解引用”即取出地址里的值。5.前置自增 vs 后置自增前置i //先让i自增在得到表达式的结果示例 int i5;int ai;结果i6 a6;后置i //先赋值后自增示例 int i5int ai结果i6 a56.全局变量 vs 静态全局变量全局变量定义在所有函数外部默认具有外部链接属性。作用域整个源文件。 其他文件可通过 extern 声明后访问。生命周期程序启动到结束。静态全局变量 static 修饰同样定义在函数外部但被 static 限制了链接属性为内部链接。作用域仅限当前源文件。 其他文件无法通过 extern 访问。生命周期程序启动到结束。7.结构体 vs 结构体指针结构体直接存储数据的副本变量本身包含所有成员的值。访问成员用 . 运算符如 stu.name 。作为函数参数时是值传递会复制整个结构体开销较大。适合数据量小、不需要修改原数据的场景。结构体指针只存储结构体的内存地址4 或 8 字节不存储数据本身。访问成员用 - 运算符如 p-name 等价于 (*p).name 。作为函数参数时是地址传递只传一个地址开销小且能直接修改原数据。适合数据量大、需要动态分配内存 malloc 或链表/树等数据结构的场景8.结构体数组 vs 数组结构体结构体数组定义数组的每个元素都是一个结构体。语法 struct Student arr[10];访问 arr[i].name用途最常见用来存储多个同类对象如10个学生信息。数组结构体定义结构体的成员中包含数组。语法 struct { int data[10]; } s;访问 s.data[i]
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →