c基础很薄弱,仅限非计算机专业大学学的那点点基础。以后会每天更新个人的学习笔记。菜鸟的我是这样学下来滴。走过路过的,不许笑话。有缘看见的,欢迎指点。
指针and数组
1.指针的运算
指针+n n是偏移量跟类型有关
2.数组
int a[]={1,2,4,5} 初始化个数即数组参数个数
int b[4]; 不赋值直接定义个数
int b[20]={0} 所有参数赋值为0
int b[23]={10} 第一个参数为10其他均为0
备注:C语言不对数组越界作检测
数组名称即为 const 指针,指向数组首地址
sizeof(数组名)=数组内占用内存字节长度
sizeof(数组名)/sizeof(单个元素) 可求出数组内参数个数
eg: sizeof(a)/sizeof(a[0])
系统控制数组名不能改变指向
指针指向数组也可以写成数组形式
3.多重指针
二级指针(二重指针)定义方式 int **Pp;可以指向一级指针p
*Pp=P指针的地址 **p=指针p指向内存保存的内容
[二级指针只能指向一级指针,一级指针不可以指向一级指针]
三级指针 int ***Ppp=&Pp
eg:
int a=10;
int *p=&a;
int **pp=&p;
int ***ppp=&pp;
printf("&a=%p\n",&a);
printf("p=%p\n",p);
printf("&p=%p\n",&p);
printf("pp=%p\n",pp);
printf("&pp=%p\n",&pp);
printf("ppp=%p\n",ppp);
printf("*ppp=%p\n",*ppp);
printf("**ppp=%p\n",**ppp);
printf("***ppp=%d\n",***ppp);
输出结果:
&a=0xbfbb87ec
p=0xbfbb87ec
&p=0xbfbb87e8
pp=0xbfbb87e8
&pp=0xbfbb87e4
ppp=0xbfbb87e4
*ppp=0xbfbb87e8
**ppp=0xbfbb87ec
***ppp=10
4.二维数组
int a[行数][列数] 应用:矩阵or地图
二维数组通过二级指针实现:二级指针+1 ==下移一行,一级指针+1 ==下移一列
eg:
int a[3][4]={};
a[2][2]=*(*(a+2)+2);
*(a+1)=&a[1][0];
*a+1=&a[0][1];
备注:二维数组名称可以作为二级数组用,但是无法用二级数组控制二维数组。可以用指针数组操作二维数组
eg:
int a[3][5]={};
int *p[3]={*a,*(a+1),*(a+2)}
数组中可能出现问题
一维数组:没有定义长度or初始化
二维数组:必须指定列数,可不指定行数,只指定列数情况下须初始化。
[变量定义失败:要给编译器足够的信息,使其分内存]
5.字符数组
初始化字符数组
char a[6]={'a','b','c','d','e'}
备注:char a[]={'a','b','c','d','e'} 未定义数组大小,系统不会默认添加结束标志。必须定义数组大小比参数多至少一位,系统默认剩余位皆为\0
char a[]="abcde"第6个位置系统默认添加字符结束标志 \0
6.二维字符数组
定义方式及规则同一维数组
char g[][4]={"aad","bbb","ccc","eee"} //不能超过(列-1)
比较字符串strncmp(), strcmp(), memcmp()