0.一个字节 8位!!!
1.scanf 输入连续字符的时候scanf(" %d%c",&n,&c)
,输入 2"空格"a 回车键,c的值为“空格”,输入2“回车”a“回车”,c的值为“回车”。 应该直接输入2a再回车,因为“空格”,“回车”都会被当做字符接收
2.数组可以定义这样:int a[]={1,2,3,4}
----大括号里面的数字根据后面的数据自动分配
数组声明后不初始化,里面值为随机值,部分初始化后,未被初始化部分自动被初始化为0
3.sizeof 是关键字不是函数 计算数组大小:sizeof(arry)/sizeof(arry[0])
4.冒泡排序(4.4),简单选择排序(4.5)
5.二维数组a[][3]
(行可以不写)
6.函数中形式参数:只有在调用的时候才会申请空间,在调用结束后内存就会被释放掉
(形参注重类型,必须写类型,名字可以不写 如:void fun(int,int )
7.三目运算符:z=x>y?x:y;
8.形参中不存在数组的概念,即使括号中约定数组大小都是无效的(传递的只是数组的首地址)
一般数组作为形参的时候(函数的参数是数组的时候)void func(int arr[],int n);
传参的时候,第一个元素的地址(&arr[0])或者数组名字(arr)作为数组的地址
9.指针和数组:
int arr[3]={4,5,6}
int *p=arr
可以用指针名表示数组:arr[i]=p[i]
可以用数组名加:*(p+i)=*(arr+i)
指针和数组的区别(可以+i不可以++,sizeof):
一.可以用指针p++,但是不可以数组arr++(指针常量和指针变量)
二.sizeof(arr)表示数组的大小 sizeof(p)表示”指针类型“的大小(sizeof(p)=sizeof(int *)=sizeof(char *
,都是指针变量大小一样)
10.二维数组:(组名可以当作指针用)
int a[3][4]
a表示行地址(理解为父)
a[0],a[1],a[2]这些表示列地址(理解为子) 数组名是地址,二维数组中a[0]这种就表示数组名a[1]=&a[1][0]
a+1 偏移一整行 a[0]+1偏移一个数据类型位置*a =a[0] => *(a+i)=a[i]
(一定要加括号,如果是*a+i
表示,先运算*a
得到列地址,再对列地址+i偏移) 所以 a[0]+1的地址表示*(a+0)+1
11.数组指针
int arr[3][4](不可以使用int *p=arr ,arr是行地址)
int (*p2)[4]
p2=arr(真正等同于二维数组名,使用时就相当于把二维数组名字替换成“p2”指针即可)
数组指针:指针偏移的时候,偏移对应大小的数组;
这个指针指向的就是一个数组;
12.函数指针(函数名是一个地址)
类比
int a int *p p=&a
char c char *p p=&c
void aaa() void (*p)() p=aaa
int bbb(int x,int y) int (*p)(int x, inty) p= bbb ------- 使用的时候:(*p)(4,5);
13.指针数组(它是一个数组,里面的数据装着指针)
int *p[4];
函数指针数组 int bbb(int x,int y) int (*p[3])(int x, inty)
14.指针函数(返回指针的函数,返回地址)
int * aaa(int,int) 这种函数的返回值是一个地址
15.二级指针(不能认为他就是可以指向二维数组)
int data=100;
int *p=&data;
int **p2=&p;//存放指针变量的地址
//所以*p2存放的是data的地址(p的内容),**p2就是得到data的值100
一般用在函数调用的时候:
void fun(int (*pdata)[3],int **p2){
//如果不用二级指针,不从main函数中得到p的地址,那么p的指针永远都是野指针。
*p2=(int *)(pdata[2]);
}
int main(){
int i;
int data[3][3]={1,2,3,4,5,6,7,8,9};
int *p;
fun(data,&p);
for(i=0;i<3;i++){
printf("%d ",*p);
p++;
}
return 0;
}
16.字符串常量和字符串变量
char arr[]="hello" //字符串变量
char *p ="hello" //字符串常量,不允许被修改。
char *p //野指针 ,不可以直接赋值:如 *p=3
17.字符串和字符数组的区别
char a[ ]={'a','b','c'};//元素个数是3(一般这样定义也要记得加'\0'防止编译的时候出现错误)
char a[]="abc"; //元素个数是4 字符串默认会加一个‘\0’表示结束
char a[128]={'\0'}; //字符串初始化
18.sizeof和strlen的区别
char a[]="hello" //sizeof(a)为6 strlen(a)为5
char arr[128]="hello" //szieof(arr)为128 strlen(arr)为5
char *p="hello" //szieof(p)为8(指针变量的大小)strlen为5
19.动态开辟内存空间
悬空指针:指针最初指向的内存已经被释放了的一种指针。(所以在free之后要及时让p=NULL,防止出现悬空指针)
malloc函数原型:void* malloc(size_t size)
开辟空间,返回地址
char *p;//野指针
p=(char *)malloc(12);
if(p==NULL){
printf("malloc error");
exit(-1);
}
memset(p,'\0',12);//初始化
int len=strlen("qqqqqqqqq1222222222222222");
int newLen=len-12+1; //+1可以用来存放'\0'
realloc(p,newLen);
strcpy(p,"qqqqqqqqq1222222222222222");//用字符串拷贝对p赋值
20.结构体
定义:
struct Student{ //名字开头最好大写
char name[128];
int age;
char sex;
};//结构体末尾记得加";",可以在“;”前面加上想要的变量名字
赋值:
struct Student stu1={"张三",12,'g'};
struct Student stu2;
strcpy(stu2.name,"李四");//字符串的赋值要用字符串拷贝
结构体数组:struct Student stu3[2]={{"aaa",12,'m'},{"bbb",13,'n'}};
如果使用指针的话,用“->”来访问结构体里面的变量。在指针p++的时候,如果第二次再次使用的话记得把指针重新指向数组头(如下图)
21.共用体/联合体(不同类型的变量共享一块内存空间)
共用体和结构体的区别:
一.结构体里面的元素有各自的内存空间 ;共用体元素共享空间,空间大小由共用体里面最大类型元素确定
二.结构体元素赋值互不影响 ;共用体赋值会导致覆盖
//场景:学生和老师信息要求记录在同一表格,学生信息有 姓名,性别,班级;
//老师的信息有 姓名,性别,职务 可以得出它们信息的区别在于职务和班级
struct ST {
char name[32];
char sex;
union quBie{
int class;
char zhiWu[32];
}qb;
};
main(){
struct ST stu;
stu.qb.class=1;
struct ST teacher;
strcpy(teacher.qb.zhiWu,"banzhuren");
}
- 枚举
enum WeekDay{ri,yi,er,san,si,wu,liu};
enum WeekDay w;
w=yi; //yi的值为1,默认是ri=0,后面依次加1
//换种方式定义
enum {ri,yi,er,san=7,si,wu,liu}w1,w2;
w1=er;//ri还是0,此时w1的值为2
w2=si;//si的值为8
- typedef
typedef int u16; //u16 a=10(等同于int a=10)
typedef int arr[10] //arr a; a[0]=10;(等同于int a[10];a[0]=10)
|
struct Text{ |typedef struct{
int a; | int a;
char b; | char b;
}; |}Demo;
typedef struct Text Demo; |
Demo t1; |Demo t1;
|