数组类型:每个数组有自己的类型,由元素类型和数组大小共同决定。
c语言通过typedef type(name)[size];重新定义一个数组名。例如:
typedef int(AINT5)[5];
AINT5 arr;
数组指针:
数组指针用于指向一个数组。
定义:arraytype* p;
type arry[5];
p=(&arraytype);
或者直接定义:type (*p)[5]
#include <stdio.h>
int arr_arr[5][5];
typedef char(CHAR5)[5];//对数组重命名
typedef int (INT5)[5];
typedef float (FLOAT5)[5];
int main(){
INT5 a5;
CHAR5 c5;
FLOAT5 f5;
FLOAT5 *pf5=&f5;//定义一个数组指针,指向f5
float f[5];
FLOAT5 *pf=&f;
char (*pc5)[5]=&c5;//定义一个数组指针,指向c5
//char (*pc)[4]=&c5;//这个会不会报错呢?
int i=0;
printf("%d,\t%d\n",sizeof(INT5),sizeof(a5));
for(i=0;i<5;i++){
(*pf5)[i]=i;
}
for(i=0;i<5;i++){
printf("%f\n",f5[i]);
}
printf("%p,\t%p,\t%p\n",arr_arr,arr_arr+1,&arr_arr+1);
printf("%p,\t%p,\t%p\n",&c5,pc5,pc5+1);
return 0;
}
指针数组:
指针数组就是一个普通的数组,每一个元素是指针。
定义: type* parr[n];
#include<stdio.h>
#include<string.h>
#define SIZE(a) (sizeof(a)/sizeof(*a))
int lookup_keyword(const char* p,const char* table[],const int size){
int ret = -1;
int i=0;
for(i=0;i<size;i++){
if(strcmp(p,table[i])==0){
ret =i;
break;
}
}
return ret;
}
int main(){
const char* keyword[] = {
"do",
"for",
"if",
"while"
};
printf("%d\n", lookup_keyword("do",keyword,SIZE(keyword)));
printf("%d\n", lookup_keyword("if",keyword,SIZE(keyword)));
printf("%d\n", lookup_keyword("main",keyword,SIZE(keyword)));
}
会打印出来0,2,和-1;
通过这节课我们能够自己编写实用性的命令了。
通常main函数有三种形式:
int main()无参;
int main(int argc,char* argv[])带有命令行参数;
int main(int argc,char* argv[],char* env[])带有环境变量参数;
main函数为由系统直接调用的函数,范例代码:
#include<stdio.h>
int main(int argc,char* argv[],char* env[]){
int i;
printf("************commd-start******************\n");
printf("\n\n\n");
for(i=0;i<argc;i++){
printf("%s\n",argv[i]);//每个元素都相当是字符串,字符型数组嘛
}
printf("\n\n\n");
printf("************commd-end******************\n");
printf("\n\n\n");
printf("************env-start******************\n");
printf("\n\n\n");
for(i=0;env[i]!=NULL;i++){
printf("%s\n",env[i]);
}
printf("\n\n\n");
printf("************env-end******************\n");
}
能打印出拟敲的命令,和环境参数