1、一重指针
1)int num =6;
int *p = #//指向num变量,存储的是num变量的地址//p的类型是指针,指向的int型数据变量
2)char *ch="hello";//由栈内存的ch变量指向常量区的“hello”字符串的首地址,也就是指向字母h,存的是h的地址
2、二重指针
int num =6;
int *p = #
int **q = &p;//指向变量p,存储的是变量p的地址。
变量q的数据类型是指针,指向一个int*的变量,存储的是int*变量的地址。
3、一维数组
char ch[6]={0};
4、二维数组
char str[][6]={"hello","world"};
//列数不能省,行数可以省,因为本质上是按行存储的,到达列数个为1行,以此来判断行数;
str[0]、str[1]分别是hello 和world的数组名;
5、指针数组//数组是主语,即,数组中存储的都是指针
int main(int argv,char *argc[])
char *ch = argc[0];//argc[0] = "hello";
char *str = agrc[1];//argc[1]= "nihao";
argc是个数组名,即是个常量,不能++,不能--;
作为函数参数传递时,对应的函数声明:
func(char *arg[],int N);
func(char **arg,int N);//数组名是个指针,数组里的内容也是指针,所以是个二重指针。
6、数组指针//指针是主语,即,指向数组的指针
char (*ch)[6];//指针ch为变量,指向一个6个字符的字符数组;也就是说ch++的话,挪动的是6个字节
ch str[2][6];//str指向的是一个2维数组,每个数组都是ch[6],str的值为str[0]的地址。
ch = str;
对应函数传递形式func(char (*ch)[6],int N);
另外,注意以下的情况
int a;
int b[6];
int *p = &a;
int *p = b;
如上所示,一个int* 指针变量可以指向一个int变量,也可以指向一个int[]数组,这是因为int[]的数组名是数组首元素的首地址,而首元素也是一个int型的,所以以上。
同理:
int a[6];
int b[4][6];
int (*ch)[6] = &a;
int (*ch)[6] = b;
误区:二重指针和二维数组名没有关系,二重指针不能指向二维数组名,数组指针才能指向二维数组名。(可以参考本文来理解)