基础
方法一:
用字符数组定义字符串,用指针访问。
#include <stdio.h>
int main()
{
char a[] = "I love China!";
char *p;
int i;
p = a; // 数组名就是数组首元素的地址,可以直接赋给指针p
// 通过指针读取并打印字符数组元素
for (i = 0; *(p+i) != '\0'; i++)
{
printf("%c", *(p+i));
}
return 0;
}
方法二:
用指针定义字符串,用数组下标访问。
#include <stdio.h>
int main()
{
char *p = "I love China!";
int i;
for (i = 0; p[i] != '\0'; i++)
{
printf("%c", p[i]);
}
return 0;
}
C语言没有定义字符串变量,字符串的存储是通过字符数组实现的。
从方法一来看,定义数组的操作实际上是把数组首元素的地址赋给数组名a,因此后面通过p = a
,直接把首元素地址赋给指针p;
从方法二来看,定义数组的操作是把数组首元素的地址赋给指针p,p也就成了数组名,因此后面也可以通过数组的方式访问数组元素。
指针数组
首先再说明一个问题,上面指针指向字符串,实际上是指针指向第一个字符元素的地址,指针指向一个元素。
既然一个指针可以指向一个字符串,那么多个指针就可以指向多个字符串,那么多个指针构成的一个指针数组就可以指向多个字符串。
// 代码1-1
#include <stdio.h>
int main()
{
char *p1[5] = {
"让编程改变世界 -- 鱼C工作室",
"Just do it -- NIKE",
"一切皆有可能 -- 李宁",
"永不止步 -- 安踏",
"One more thing... -- 苹果"
};
int i;
for (i = 0; i < 5; i++)
{
printf("%s\n", p1[i]);
}
return 0;
}
p1是一个指针数组,其中的每一个元素都是指针,每个指针指向一个字符数组的首元素。
每个指针元素又可以看成是一个数组名,因此在打印的时候,有p1[i]
,相当于:
// 代码1-2
#include <stdio.h>
int main()
{
char a[] = "ABCDE";
printf("%s", a);
}
指向指针的指针
再看代码1-1片段,进行一下修改:
// 代码2-1
#include <stdio.h>
int main()
{
char *p1[5] = {
"让编程改变世界 -- 鱼C工作室",
"Just do it -- NIKE",
"一切皆有可能 -- 李宁",
"永不止步 -- 安踏",
"One more thing... -- 苹果"
};
char **p;
p = &p1[1]; //p1[1]是指针数组的一个元素,是一个指针,对指针取地址
printf("%s", *p); //前面多了个取值,这里就多一个解引用,看代码2-2
return 0;
}
与下面这段一个道理
// 代码2-2
#include <stdio.h>
int main()
{
char *p= "ABCDE";
char **pp;
pp = &p;
printf("%s", *pp);
printf("%s", p);
}
这种有点类似于多此一举的骚操作有什么好处呢?以上例子是看不出来的,看下面的例子,用于指针数组元素的分类,可以避免创建多个指针数组,而且也便于修改。其实很好理解,把实体存一份,用指针来分类,用的时候用指针查找。
#include <stdio.h>
int main()
{
char *books[6] = {
"《C程序设计语言》",
"《C专家编程》",
"《C和指针》",
"《C陷阱与缺陷》",
"《C prime Plus》",
"《带你学C带你飞》"
};
char **other[5];//指针数组
char **fishC; //一个指针
int i;
// 利用指针指向进行分类
other[0] = &books[0];
other[1] = &books[1];
other[2] = &books[2];
other[3] = &books[3];
other[4] = &books[4];
fishC = &books[5];
printf("小甲鱼出版的书籍:\n");
printf("%s\n\n", *fishC);
printf("其他经典书籍:\n");
for (i = 0; i < 5; i++)
{
printf("%s\n", *other[i]); // 这里采用访问数组名的方式打印字符串
}
return 0;
}
网友评论