今天终于弄明白了,指针数组,和指向指针的指针的区别。
1 #include <stdio.h> 2 #include <string.h> 3 void main() 4 { 5 6 char a[]="1234567890MMMMMMM"; 7 char *p= a; 8 char** argv=&p; 9 printf("%s\n",*(argv+0)); 10 //char *argv[]={"12345","67890","MMMMMMM"}; 11 //for(i=0;i<3;i++) 12 //{ 13 // printf("%s\n",argv); 14 //} 15 } 一. 指针概念: 当我们程序如下申明变量: short int i; char a; short int * pi; 程序会在内存某地址空间上为各变量开辟空间,如下图所示。 内存地址→6 7 8 9 10 11 12 13 14 15 ------------------------------------------------------------------------------------- … | | | | | | | | | | ------------------------------------------------------------------------------------- |short int i |char a| |short int * pi| 图中所示中可看出: i 变量在内存地址5的位置,占两个字节。 a变量在内存地址7的位置,占一个字节。 pi变量在内存地址9的位置,占两个字节。(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节) 接下来如下赋值: i=50; pi=&i; 经过上在两句的赋值,变量的内存映象如下: 内存地址→6 7 8 9 10 11 12 13 14 15 -------------------------------------------------------------------------------------- … | 50 | | | 6 | | | | -------------------------------------------------------------------------------------- |short int i |char a| |short int * pi| 看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。如: *pi=5; //就是等价于I=5; 二. 指针的地址与指向另一指针地址的指针 我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10。同样的,我们也可能让某个指针指向这个地址。 看下面代码: short int * * ppi; //这是一个指向指针的指针,注意有两个*号 ppi=pi {dy}句:short int * * ppi;——申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个short int * 类型指针变量的地址。 第二句:&pi那就是取pi的地址,ppi=pi就是把pi的地址赋给了ppi。即将地址值10赋值给ppi。如下图: 内存地址→6 7 8 9 10 11 12 13 14 15 ------------------------------------------------------------------------------------ … | 50 | | | 6 | 10 | | ------------------------------------------------------------------------------------ |short int i|char a| |short int * pi|short int ** ppi| 从图中看出,指针变量ppi的内容就是指针变量pi的起始地址。于是…… ppi的值是多少呢?——10。 *ppi的值是多少呢?——6,即pi的值。 **ppi的值是多少呢?——50,即I的值,也是*pi的值。 |