C语言学习的第七天(续)

来源:互联网 发布:php时间戳转换年月日 编辑:程序博客网 时间:2024/06/05 00:08

在上一节讲了数组指针和指针数组以及它们的用法和区别。
在这一节中将要了解指向指针的指针,即二级指针。
下面请看例题:

例1:
int main()
{
char *name[]={“Follow me”,”BASIC”,”Great Wall”,”FORTRAN”,”Computer desighn”};
char **p=name;
int i;
for(i=0;i<5;i++)
{
p=name+i;
printf(“%s\n”,*p);

}

return 0;

}
在这个程序中首先定义了一个字符型指针数组,然后又定义了一个二级指针,并让它指向指针数组的首地址。然后用循环输出。
这个程序看似很短,但它里面包含的内容却非常之多,下面请看我的分析。
我先定义了一个二级指针p,它里面存放的内容是p,但它也是一个地址,这个地址里存放的内容是 p,因为p是指向name的,而name又是一个指针数组,它里面存放的是字符型的指针,所以 *p就相当于name[0] 等元素,但同时这些元素又可以看作是其中的每个字符串的首地址,所以 *p就与每个字符串里面的各个元素相对应。
所以后面的赋值就可以理解了,最后我们要对每个字符串进行输出,所以用 p,如果我们要对每个字符串的首字母进行输出,那么就用 *p,注意这个时候前面要用%c,因为这时候是对字母进行输出了,不然会出现段错误。
运行结果:
Follow me
BASIC
Great Wall
FORTRAN
Computer desighn

为了加深对二级指针的理解,请看下面这段代码。
例2:
int main()
{
char **p;
printf(“%0x %0x\n”,p,p+1);
printf(“%0x %0x\n”,*p,*p+1);
return 0;
}
这段代码十分的精简,但它可以加深我们对二级指针的理解。
运行结果:
51e3c0 51e3c4
57e58955 57e58956
从中我们可以知道p与p+1相差4个字节,而 *p和 *p+1只相差一个字节。
这是为什么呢?
因为p所指向的是指针类型,不管指针指向什么类型,它的跨度都是4个字节,而 *p也是指针,但它指向的是char类型,而char类型每次扫过1个元素只有1个字节的长度,你可以定义一个 char *p来验证,输出p和p+1,看它们相差几个字节。

例3:
void main(int argc,char *argv[],char *env[])
{
int i;
printf(“==================begin argv=====================”);
for(i=0;i