c语言中的指针与数组的理解

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;

误区:二重指针和二维数组名没有关系,二重指针不能指向二维数组名,数组指针才能指向二维数组名。(可以参考本文来理解)

发布了100 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/modi000/article/details/105320073