文章目录
嵌入式学习Day2(2024.03.10)
C语言关键字
C语言main函数参数
C语言数组
整型数组
定义
int name[size]; //定义固定长度数组
int name[] = {1,2,3} //由元素个数确定数组长度
整形数组初始化
- 定义时初始化
int arr[3]={1,2,3}
- 定义时部分初始化
int arr[3]={1,2} //其他剩余元素默认为0
- 定义时全部初始化为同一值
int arr={1} //全部初始化为1
字符数组和字符串
1.man ascii //查看ascii对应码值
2.C语言中字符数组可看作字符串
3.定义和初始化与整形数组一样 // 注意 char str[3]={‘\0’} 等价于 char str[3]={0}
4.可以将字符串直接初始化给字符数组 eg: char str[]=“hello” char str[]={“hello”} char[30]=“hello”
5.字符数组初始化还可以使用memset函数
void *memset(void *s, int c, unsigned long n);
memset函数:将s指向的内存位置后面n个字节的存储空间替换为c
eg: memset(a,‘a’,sizeof(a));//初始化 char a[10]
6.字符数组以’\0‘结尾,字符数组使用时注意初始化,或特意给最后一位复制 ’\0‘
二维数组
定义时行数可以省略,但列数必须写。使用这种方法定义二维数组时必须同时初始化
二维数组完全初始化 arr[2][2]={x,x,x,x,x,x,x…} arr[2][2]={{},{}}
数组技巧
数组名为数组首地址
数组求长
int len=sizeof(name)/sizeof(name[0]);
C语言指针
指针的定义
数据类型 * 指针变量名
指针变量保存的是对应类型的变量的存储地址
& 取址符
野指针:指针变量保存的内容不合法,定义变量后变量的地址在程序中才是合法的
void * 变量名:void指针可以保存任意类型的地址,所以不能通过void指针操作指针所指向的对象的内容,只是作 > 为函数的返回值或参数使用
指针类型强转: void*p; *(double )p; 一般void * 使用时需要强转类型
指针初始化:一般初始化为0地址 int a=0; 一般对0地址没有操作权限
指针变量的大小由操作系统位数决定
int a; //定义了一个整型变量a
int * add_a; //定义了一个整型指针变量 add_a
add_a = &a ; //&a 表示变量a的内存地址,add_a可以用来保存a的内存地址
*add_a=30; //* + 指针变量 表示指针变量保存的内存地址中的内容 *add_a=30 等价于 a=30 即通过指针变量操作内存中的内容
int a[10];
int *add_a=a; //数组名为地址变量
for(int i=0;i<10;i++){
printf("a data:%d ",*add_a);
printf("a data:%d ",*(a+i));
add_a++;
// a++ 是不被允许的,因为a是数组名是一个常量不能修改,add_a是一个变量,可以修改
}
/*通过对指针的操作可以遍历数组*/
上述代码中 a=&a[0],&a表示整个数组的大小,a+1 表示偏移一个int,&a+1 表示偏移一个数组的大小
多级指针
概述
一级指针用来保存普通变量的地址,二级指针用来保存一级指针变量本身的地址,三级指针用来保存二级指针变量本身的地址。
使用
int a=10;
int * p=&a; //一级指针
int * *p=&p; //二级指针
int char** str=(char **)&p; //二级指针强转
指针数组
1、指针数组以 NULL(0地址结尾)可以避免计算数组长度;
2、指针数组=====> 二级指针
数组指针
#include<stdio.h>
int main(){
int a[2][2]={{1,2},{3,4}};
int (*p)[2] =a;
/*通过指针循环输出数组a*/
for(int i=0;i<2;i++){
p=p+i;
for(int j=0;j<2;j++){
printf("输出:%d \n",*(*(p)+j));
}
}
}