作者简介
*架构师李肯(全网同名)**,一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、主流IoT云平台的对接、嵌入式IoT系统的架构设计等等。拥有多项IoT领域的发明专利,热衷于技术分享,有多年撰写技术博客的经验积累,连续多月获得RT-Thread官方技术社区原创技术博文优秀奖,荣获CSDN博客专家、CSDN物联网领域优质创作者、2021年度CSDN&RT-Thread技术社区之星、2022年RT-Thread全球技术大会讲师、RT-Thread官方嵌入式开源社区认证专家、RT-Thread 2021年度论坛之星TOP4、华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!
【C语言经典面试题】这样的char * 定义怎么回事
代码写得多了,都有点怀疑人生了,看到这样的变量定义,竟然忍不住怀疑起来!
文章目录
- 1 写在前面
- 2 问题描述
- 3 问题解释
- 4 简单验证
1 写在前面
C语言作为嵌入式的入门编程语言,毋庸置疑,学会了它,可以让你在嵌入式软件编程中得心应手。但是,如果你的基础不牢,往往会面对一些代码时,甚至会怀疑人生,比如下面的这段很段很简单的代码,你是否能够准确掌握呢?
可以试试看吧。
2 问题描述
有这么一段代码:
char *p1,p2,p3;
请分别说出p1、p2、p3分别属于什么类型?
这个问题的来源是我自己疑惑出来的。
有一天,我看到我自己的写的这段代码,自我怀疑了一下,咦,这几个变量到底是什么类型啊?
3 问题解释
其实上面的问题是一个很基础的C语言知识,但是应该你太久没有接触这些基础的知识,天天在写一些业务代码,往往容易忽略这些基础的东西。
我们首先来看一下:
p1 变量,毫无疑问,它肯定是 char * 指针,即指向char类型的指针变量;
而p2 变量呢,它到底是char * 类型还是 char 类型呢?
p3变量的情况与p2类型,我们暂且只分析p2 变量。
根据 指针定义符号 * 的 右结合性 ,它首先是跟 p1 结合在一起,组合成一个指针变量;
而到了p2变量这,没有 * 号与之结合,自然它的类型应该是 char类型, 而不是char *类型。
4 简单验证
为了验证这个观点,我特意写了一段代码做验证:
#include <stdio.h>
int main(void)
{
char c;
char *array;
char *p1, p2, p3;
char *p4, *p5, *p6;
printf("sizeof(array) = %d\n", sizeof(array));
printf("sizeof(c) = %d\n", sizeof(c));
printf("sizeof(p1) = %d\n", sizeof(p1));
printf("sizeof(p2) = %d\n", sizeof(p2));
printf("sizeof(p3) = %d\n", sizeof(p3));
printf("sizeof(p4) = %d\n", sizeof(p4));
printf("sizeof(p5) = %d\n", sizeof(p5));
printf("sizeof(p6) = %d\n", sizeof(p6));
return 0;
}
通过运行这段测试代码,可知:
正如我们分析的那样,p1是指针类型,而p2和p3都是char类型;而类似定义中,p4/p5/p6都是指针类型。
这里,我们是利用了sizeof的特性:它对普通变量求值,得出的是该类型占内存的大小;而对任意指针变量求值,得出的都是指针类型在该平台下所占内存的大小,即为机器的字长。