int n =5;char arr1[n];//这是错的,c中定义数组只能用常量定义容量不能用变量定义容量int arr2[10]={1,2,3}//不完全初始化,剩下为初始化的全是0✅char arr3[5]={'a','b'}//不完全初始化,剩下为初始化的全是0✅char arr4[5]="hel"//✅char arr5[]="hel"//✅strlen 不包括结束符 sizeof包括结束符
h e l '\0',strlen(arr5)=3,sizeof(arr5)=4char arr6[]={'a','b'}// a b strlen(arr6) = 随机值,sizeof(arr6) = 2
int arr1[3][4]={1,2,3,4,5};//三行四列数组,这样会顺序初始化int arr2[3][4]={{1,2,3},{4,5}};//第一行初始化三个,第二行初始化两个,按顺序来。int arr3[][4]={{1,2},{1,2,3,4}};//列不可省略,行可以省略
3、数组作为函数参数传递(传递的是首地址,所以在被调用的函数中无法通过sizeof计算出数组长度)
#include<stdio.h>#include<string.h>//冒泡排序voidbubble_sort(int arr[],int m){int temp;// int n = sizeof(arr)/sizeof(arr[0]);int n = m;for(int i =0;i<n-1;i++){for(int j =0;j<n-i-1;j++){if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j]= arr[j+1];
arr[j+1]= temp;}}}}intmain(){int arr[]={9,8,7,6,5,4,3,2,1,0};bubble_sort(arr,10);//传递的数组为首地址,所以在调用函数中计算不出数组的大小,所以数组大小必须穿过去for(int i =0;i<10;i++){printf("%d",arr[i]);}return0;}//&数组名:代表的是整个数组的地址
4、指针
//存放地址的变量称为指针变量int a =10;int* p =&a;//p即指针变量int* p;//*p能够访问4个字节char* p;//*p能够访问1个字节double*p;//能够访问8个字节//指针类型决定了:指针走一步走多远int* p; p+1-->4char* p; p+1-->1double* p; p+1-->8//野指针就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)//二级指针int a =10;int* pa =&a;int** ppa =&pa;//二级指针//指针数组-数组-存放指针的数组int arr1[]={1,2,3,4,5};int arr2[]={2,3,4,5,6};int arr3[]={3,4,5,6,7};int* parr[]={arr1,arr2,arr3};int i =0;for(int i =0;i<3;i++){for(int j =0;j<5;j++){printf("%d ",*(parr[i]+j));}printf("\n");}//数组指针-指针-指向数组的指针-可以存放数组的地址int arr[10]={0};//&arr:数组的地址int(*p)[10]=&arr;//p即数组指针
5、指针和数组
int arr[10]={1,2,3,4,5,6,7,8,9};int* p = arr;//p存放的是数组首元素地址
6、指针进阶
char* p ="abcdefg";//"abcdefg" 是一个常量字符串---首字符的地址赋给了p---------char* p ="abcdef";//把字符串的首地址赋给了p*p ='w';//有问题,不能改,报段错误printf("%s",p);---------//接收二维数组要用数组指针voidtest(int(*arr)[5]){}intmain(){int arr[3][5]={0};test(arr);}---------//函数指针-指向函数的指针 存放函数地址的一个指针&函数名和函数名都是函数的地址
intAdd(int x,int y){int z = x + y;return z;}int(*pa)(int,int)= Add;printf("%d\n",(*pa)(2,3));//5
7、回调函数就是通过函数指针调用的函数
intadd(int x,int y){int z = x + y;return z;}voidcal(int(*ptr)(int,int)){int x =0;int y =0;scanf("%d%d",&x,&y);printf("%d\n",ptr(x,y));}intmain(){cal(add);return0;}