读者,你好!
如果你精通C,希望能得到你的斧正;如果你是初学者,希望能对你有所帮助。
加粗的是一些我认为比较重要的内容。
为了更好的理解这部分内容,我们先看一个例子:
#include <stdio.h>int main(){ char *ps ; ps = "C language!"; /*定义字符指针*/ printf("%s\n", ps); /*用字符指针PS来输出字符串的内容*/ return 0;}
运行结果为:
ps = "C language!
, 将无名储存区的首地址赋给指针ps,也就是说,指针变量ps 指向无名储存区域的首地址,而不是把无名储存区域的内容保存在ps中,C | l | a | n | g | u | a | g | e | ! | \0 |
---|
ps^
还是从具体的列子出发:
#include <stdio.h>int main(){ char *ps = "C language!"; int n = 2; ps = ps+2; /*移动指针ps*/ printf("%s\n", ps); return 0; }
运行结果:
这里初始化的时候把首地址赋给了ps , 后面操作ps= ps+2
时,ps指向l
所在的空间。
char *ps; ps = "C language!";
赋值, 而数组不能这样char A[20];A = "C language!
;赋值,而要逐个赋值。语法 | 类型标识符 *数组名[整形常量表达式]; |
---|---|
样列 | int *p[3]; |
说明 | “int *p[3];”表示p是一个指针数组名,他有三个元素p[0],p1],p[2],每个元素都是一个指针,而这些指针都指向整形变量。 |
注意不要写成int (*p)[3];
这是上一篇说的指向数组的指针变量,表示长度为3的指向一维数组的指针变量。
指针数组比较适合于用来指向若干个字符串,是字符串处理更加灵活方便。
比如图书馆有若干本书,要将这些书名存在一个数组中,一般的方法用二维数组来存,就得定义该字符数组的列数为最长书名的长度,这样就非常浪费空间。
#include <stdio.h>#include <string.h>#define N 5int main(){ char *name[N] = {"Data Structure", "Programming C", "Java", "Operating System", "Data base"}; char *temp; int i, j, front; for(i = 0; i < N -1;i++) { front = i; //假设按字典顺序,第i个书名应位于前 for(j= i + 1;j < N;j++) { if(strcmp(name[front], name[j]) > 0)//判断其先后顺序是否合理 { front = j; } } if(front != i) //若顺序不合理,也就是原先的假设不成立,交换指针的值(地址) { temp = name[front]; name[front] = name[i]; name[i] = temp; } } for(i= 0;i<N;i++) { printf("%s\n", name[i]); } return 0 ;}
运行结果:
联系客服