字符数组:数组长度和存储长度不一样,除了存储内容外,字符数组将'\0'作为字符数组结束的标志,存储长度是数组长度加一。
通过strlen()算出的数组长度是内容长度,是存储长度减一。sizeof求数组的长度时:
char bbb[2]="12";
char ccc[]="12";
printf("bbb[2]: %d\n",sizeof(bbb)); //sizeof 求出是2
printf("ccc[2]: %d\n",sizeof(ccc)); //sizeof求出是3
指针数组:
int *p[3]={1,2,3}
char *c[2]={"123","456"};
char *c[]={"123","456"}; //数组在声明的时候可以缺省大小,但初始化必须是确定的内容
指针数组:数组的内容是指针。例如c[0]是指向字符串“123”的指针,c[1]是指向字符串"456"的指针。
指针数组的使用:
#include<stdio.h>
int main(){
int a[]={1,3,4},b[]={5,7,9},*p[2];
p[0]=a;
p[1]=b;
*p[0]=12;//使a[0]=12
printf("%d ",*p[0]);//12
printf("%d ",++*p[0]);//13 访问a[0],使a[0]自增
printf("%d ",*p[0]);//13
printf("%d ",*p[0]++);//13 访问a[0],print a[0],随后指针自增,p[0]指向a[1]
printf("%d ",*p[0]);//3
}
注意:++*s 表示对s指向的数据进行自增,s指向的位置不变;*s++ 表示访问了s指向的数据后,指针s自增,s指向原来数据的下一条数据
用指针数组表示多维数组;
这样不会有多为数组那样有严格的大小限制:
char *p={"i am hust","tomorrow is today","hahahahahahahahhahaha"};
上面就是相当于多维数组,在一维指针数组中让指针指向不同大小的字符串
#include <stdio.h>
void f(char **p)
{
*p += 2;
}
int main(){
char *a[] = {"123", "abc", "456"};
char **p = NULL;
p = a;
printf("%s ",a[0]);//123
printf("%s ",a[1]);//abc
printf("%s \n",a[2]);//456
printf("%s ",*p);//123
printf("%s ",*p+1);//23
printf("%s ",*p+2);//3
printf("%s ",*p+3);//输出空格
printf("%s ",*p+4);//abc
printf("%s ",*p+5);//bc
printf("%s ",*p+6);//c
printf("%s ",*p+7);//输出空格
printf("%s \n ",*p+8);//456
printf("%s ",*(p+1));//abc
printf("%s ",*(p+2));//456
printf("%c ",*(*(p+2)+2));//6
printf("%s ",*(p+3));//overflow
printf("%s ",*(p+4));//overflow
printf("\n\n\n");
f(p);
printf("%c\n", **p);//3
printf("%s\n", *p); //3
//printf("%s\n", **p); this is wrong
return 0;
}
p是二维数组,p指向a[0][0]的首地址,*p指向的是数组a[0]的首地址,则*p+1指向的a[0]第二位地址,则输出从第二位开始后面的字符串,*p+2 同上
p相当于是上一篇文章中指出的行指针,所以p+1,p+2等是在a[0],a[1]之间的移动.用法和上篇讲到的二维数组一样。但是在二维数组中不能这样声明二重指针: **p
#include<stdio.h>
int main(){
char a[3]="abc";
char *p=a;
//printf("%c",a[2]);
printf("%c",*(p+0));//abc
printf("%c",*(p+1));//bc
printf("%c\n",*(p+2));//c
//printf("%c\n",*(p+3)); 乱码
printf("%s\n",p);//abc+乱码
printf("%s\n",p+1);//bc+乱码
printf("%s\n",p+2);//c+乱码
//printf("%s",p+3);
// printf("%c",a[4]);
printf("aa:\0");
return 0;
}