c语言字符串指针数组(指针和数组、字符串 | C语言教程 | C语言系列教程)
下面仍然是初学者容易搞错的地方 。指针变量加n或减n ,并不是地址加n或减n ,而是当前所指的地址向后或向前跳n次所指的地址 。
#include <stdio.h> int main(void) { int num[] = {50, 25, 75, 100}; int *pt; pt = num + 1; //故意将第2个元素地址赋给指针变量 //显示指针变量所指的地址以及指针的值 printf("pt =%d, *pt =%d\n\n", pt, *pt); //当指针变量减1或加1时,所指的地址并不减1或加1 ,而是加减4 ,因为int是4个字节 printf("pt-1=%d, *(pt-1)=%d\n", pt-1, *(pt-1)); printf("pt =%d, *pt =%d\n", pt, *pt); printf("pt+1=%d, *(pt+1)=%d\n", pt+1, *(pt+1)); //显示pt当作数组用时的值。(注意:[-1]仍然是正确的) printf("\npt[0]=%d, pt[-1]=%d\n", pt[0], pt[-1]); return 0; }char型的指针数组相当于二维字符数组 ,并不等于说指针数组可以直接转化为二为字符数组 ,相反字符数组可以直接转化为指针数组 。因为二维字符数组的地址是连续的 ,而指针数组所指的元素不一定连续(如下的m1、m2 、m3的地址可以不连续 ,长度也可以不一样) 。
#include <stdio.h> int main(void) { char *m1 = "www.quanxue.cn"; char *m2 = "www.51minge.com"; char *m3 = "这儿是小雅的C语言教程"; char *message[3]; //| #include <stdio.h> int i; //| //| int main(void) message[0] = m1; //| { message[1] = m2; //| char *message[] = {"www.quanxue.cn", message[2] = m3; //| "www.51minge.com", //| "这儿是小雅的C语言教程"}; for (i=0; i<3; i++) { //| for (i=0; i<3; i++) { printf("%s\n", message[i]); //| printf("%s\n", message[i]); } //| } //| return 0; //| return 0; } //| }在第一章讲main()函数的参数时 ,已经见过指针的指针 ,这和指针数组有相同的作用 ,但还是有细小的区别 。指针数组可以在定义时直接初始化,而指向指针的指针不行 。正如二维数组一样 ,不指定第二维长度不能直接初始化一样 。即不能char str[][]={"...", "...", ...}
#include <stdio.h> int main(void) { char *message[] = {"www.quanxue.cn", "www.51minge.com", "这儿是小雅的C语言教程"}; char **p; //指向指针的指针 int i; p = message; //指向指针的指针赋初值 for (i=0; i<3; i++) { printf("%s\n", p[i]); } return 0; }让许多初学者遗憾的是 ,C语言没有提供数组长度的函数,但可以用sizeof()运算符先求数组的总长度 ,再求出数组类型的长度 ,二者相除便得到数组的长度 。C语言更大的一个遗憾便是,sizeof()对指针变量求值时 ,结果总是4 ,这是因为指针变量的内容是地址 ,地址总是4个字节来表示 。
因此有经验的编程人员 ,在用指针作参数时 ,一般总是同时多定义一个参数 ,来存放其长度 。也就是指针和其长度同时传递过去 。另外 ,数组长度如果事先知道 ,一般定义为常量。
#include <stdio.h> int main(void) { char *msg[] = {"www.quanxue.cn", "www.51minge.com", "这儿是小雅的C语言教程"}; double dNum[] = {12.5, 24.55, 100.83}; double *p = dNum; printf("dNum的size:%2d, 数组个数是:%d\n", sizeof(dNum), (int)sizeof(dNum)/sizeof(double)); printf(" p的size:%2d, 数组个数是:%d\n", sizeof(p ), (int)sizeof(p )/sizeof(double)); printf(" msg的size:%2d, 数组个数是:%d\n", sizeof(msg ), (int)sizeof(msg )/sizeof(char *)); return 0; }创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!