zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

【C语言经典面试题】这样的char * 定义怎么回事

2023-02-18 16:28:17 时间

作者简介 *架构师李肯(全网同名)**,一个专注于嵌入式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 写在前面

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的特性:它对普通变量求值,得出的是该类型占内存的大小;而对任意指针变量求值,得出的都是指针类型在该平台下所占内存的大小,即为机器的字长。