上代码:
/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/
#include <stdio.h>
int main()
{
char *ch1 = "you want to meet me";
char *ch2 = "i love you";
char *ch3 = "wake up";
char *a[3] = { ch1, ch2, ch3};
printf ("a[0] %4s\n", a[0]);
printf ("a[0] %4p\n", a[0]);
printf ("ch1 + 4 %4p\n", ch1 + 4);
printf ("a[0] + 4 %4p\n", a[0] + 4 );
printf ("&a[0] %4p\n", &a[0]);
printf ("*(a[0] + 4) %4c\n", *(a[0] + 4) );
printf ("-------------------------\n");
printf (" %s\n", a[1]);
printf (" %p\n", a[1]);
printf ("--------------------------\n");
printf (" %s\n", a[2]);
printf (" %p\n", a[2]);
printf ("--------------------------\n");
printf ("&a= %4p\n", &a);
printf ("a= %4p\n", a);
printf ("a+1= %4p\n", a+1);
printf ("*(a+1)= %4p\n", *(a+1));
printf("---------------------------\n");
char **p = a;
printf ("p %4p\n", p);
printf ("*(*(a+0) + 4) %c\n", *(*(a + 0) + 4) );
printf ("\n");
return 0;
}
上结果:
先看前三段,每段开头先输出原字符串,利用指针数组,输出数组每个指针指向的ch的字符串。
以第一段为例,
对于,字符串的地址,利用a[0]输出,这便是第一个字符y的地址,数组名字符串名代表首个元素的地址。
对于ch+4,ch指向字符串y,+4便是对第5个进行操作,输出地址。同样,a[0]存的是指向这个字符串的指针,对于a[0]的操作便是对指针的操作,也可以得到输出地址。
在一级指针中a,&a[0],&a这三个操作会得到一样的值。都表示指针数组的首地址,但要是对于下一个指针进行操作,&a不行,在同样数据类型的时候,他会出现在数组的下一位,出现越界。在一个指向int类型的指针数组中&arr+1会直接跳过20个字节。同样,32位下,指针大小为4,所以在数组加1后会跳过16个字节。
*(a[0] + 4)是取第1个字符串的第5个元素,在第5段中,二级指针用法相类似。
第五段中,p是一个指向指针数组的指针,所以p的内容便是a的首地址。