一、结构体赋值:
1.初始化赋值,只需要按成员顺序初始化
typedef struct {
int Int;
int Array[3];
}MyStruct;
MyStruct Parameters_1 = {1, {1, 2, 3}};
2.点运算逐个成员赋值(使用点符)
Parameters_1.Int = 30;
3.整体赋值(相同类型结构体直接赋值)
MyStruct Parameters_2;
Parameters_2 = Parameters_1;
4.通过指针赋值(箭头运算符)
Parameters_1 -> Int = 50;
二、指针
1.pInt 与 *pInt
int *pInt = (int *)pvParameters;
int pvParameters_3 = 1;
| 表达式 | 类型 | 含义 | 本例中的值 |
|---|---|---|---|
| pInt | int型指针 | 指针变量(地址) | 0x4000 |
| *pInt | 整型 | 指针解引用 | 42 |
| pvParameters_3 | 整型 | 变量 | 1 |
| &pvParameters_3 | 地址/指针 | 取变量地址 | 0x4001 |
2.数组的指针
数组名是一个指向数组首元素的常量指针(不能修改其指向),例如数组Array
Array的类型是int * ,(传递的是指向首元素的指针)
&Array的类型是int(*)[3];(传递的是指向整个数组的指针)
这两个在数值上是一样的(都是同一个内存地址),但是类型不同
区分一下,指针,指针的地址,指针存储的地址(指针指向的地方)
指针也是一个变量,变量本身占用内存空间
平常说的指针是一个地址,指的是指针指向的地址
例:
假设系统状态:
TCB实际地址:0x20001000
TaskHandle_1变量地址:0x08005000
TaskHandle_1存储的值:0x20001000
TaskHandle_1变量占4字节内存
*TaskHandle_1(指针解引用),取的是存储的地址(如0x20001234)
&TaskHandle_1得到的是指针的地址(如0x800A000)
3.字符串与指针
字符串字面量如“Hello”本质是静态存储区的字符数组
const char *str ="Hello";
4.函数的指针
在C语言中,函数名代表函数的起始地址,所以函数名本身就是一个函数指针。当我们使用函数名时,实际上就是在使用该函数的指针。
void Task_1 (void *pvParameters)"{
int *pInt = (int *)pvParameters;
ESP_LOGI(TAG,"输入的整型为:%d",*pInt);
vTaskDelete(NULL);
}
int parameters_1 = 1;
void app_main(void){
xTaskCreate(Task_1,"Task_1",2048,(void *)parameters_1,1,NULL);//第一个参数为函数指针,此处用函数名
}
三 、%s格式符的特殊性:
1.%s要求传入一个字符指针(char*)
2.它会从这个地址开始:
读取第一个字符,后自动递增地址(pChar + 1),继续读取直到遇到\0;字符串的本质是指针操作
int *pInt = (int *)pvParameters;
ESP_LOGI(TAG, "输入的整数类型为:%d,*pInt);
char *pchar = (char *)pvParameters;
ESP_LOGI(TAG,"输入的字符串为:%s",pchar);//不用加*号
66万+

被折叠的 条评论
为什么被折叠?



