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

PpP指针的地址      **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()