C语言常见问题与笔记

主要参考:2023最新嵌入式学习路线! (qq.com)

0.常见其余问题

1.指针:一级/二级指针,指针数组,数组指针,指针函数,函数指针

2.数组:一维/二维数组 排序等

3.字符串

4.关键字:#define assert const const static volatile extern sizeof typedef等

5.函数:strlen strcmp strstr memcpy sprintf等

6.内存:堆栈,内存分配 malloc/free  大小端

7.变量:变量类型/占用字节数,局部/全局/静态变量,形参/实参

8.结构:结构体 联合体,枚举

=====================

0.

C语言结构体中"->" 和"."的区别

①若定义的结构体变量,则访问数据时用".";

②若定义的结构体指针,则访问数据时用"->";

typedef struct{			//定义一个结构体,类似于C++里面定义一个类
	int data;
}Structure_V1;
				//下面类似于C++里面定义两个对象
Structure_V1 aaa;		//定义结构体变量:aaa
Structure_V1 *paaa;		//定义结构体指针:paaa

下面是访问数时的用法:

aaa.data=0;			//定义的结构体变量,访问数据时用"."
paaa->data=1;			//定义的结构体指针,访问数据时用"->"

个人理解:

".":正常定义结构体,访问成员时使用

"->":指针指向

1累加到100

复合算术赋值 “+=”

int num=0;

for (int i=0;i<=100;++i)
{
sum += i;
}

4.

关键字:#define

#define又称宏定义,标识符为所定义的宏名,简称宏。

#define 的功能是将标识符定义为其后的常量。

使用宏定义可以用宏代替一个在程序中经常使用的常量。注意,是“经常”使用的。这样,当需要改变这个常量的值时,就不需要对整个程序一个一个进行修改,只需修改宏定义中的常量即可。且当常量比较长时,使用宏就可以用较短的有意义的标识符来代替它,这样编程的时候就会更方便,不容易出错。因此,宏定义的优点就是方便和易于维护。

需要注意的是,预处理指令不是语句,所以后面不能加分号。

# include <stdio.h>
# define NUM 5
int main(void)
{
    int i, j = NUM;
    int a[NUM] = {0};
    printf("请输入%d个数:", j);
    for (i=0; i<NUM; ++i)
    {
        scanf("%d", &a[i] );
    }
    for (i=0; i<NUM; ++i)
    {
        printf("%d\x20", a[i]);
    }
    printf("\n");
    return 0;
}

输出结果是:
请输入5个数:5 4 3 2 1
5 4 3 2 1

5.

函数:strlen

strlen() 函数从字符串的开头位置依次向后计数,直到遇见 “ \0 ”,然后返回计时器的值。最终统计的字符串长度不包括 “ \0 ”。

	/*strlen*/

	char str[] = "ABCD";
	printf("str sizeof is %d\n",sizeof(str));
	printf("str strlen is %d\n", strlen(str));

Printf实现

void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	
	Serial_SendString(String);
}

void Serial_Printf(char *format, ...)         参数1:开辟一个字符空间;参数2:...  可变参数列表

    char String[100];        首先定必输出的字符串
    va_list arg;                 定义一个参数列表变量(对应可变参数列表)
    va_start(arg, format);        从fommat位置开始接收参数表,放在arg里面
    sprintf(String, format, arg);        打印位置是String,格式化字符丰是fomat,参数表是arg
    va_end(arg);                之后,va_end(arg),释放参数表
    
    Serial_SendString(String);        就是Serial Sendstring,把String发送出去

9.

int *const p(char *p const) 与 int const* p(const int *p)  的区别

int * const p:const 修饰 p , 指针变量 p 不可修改,但其内容 *p 可以修改

int const *p:const 修改 *p ,其内容 *p 不可以修改,但指针变量 p 可以修改

猜你喜欢

转载自blog.csdn.net/qq_42241352/article/details/130766347
今日推荐