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

指针数组和数组指针区别,已在前文中提到过,这里通过举例进一步分析

1、数组指针

数组名取地址的情况已经在该文中说明。

  char ch[6] = "hello";
  char (*str)[6] = &ch; 

数组名取地址后,表示指向这个数组的指针,值仍是第1个元素的地址。

数组名取地址后再解引用,表示的是这个数组本身,用数组的首元素地址标识数组,故值仍是第1个元素的地址。

也就是说,*str == *(&ch)==ch;

1)数组指针指向一维数组的情况:

    char ch[6] = "hello";
    char (*str)[6] = &ch; 

如上,1)&ch+1,移动了6个字节单元;ch+1移动了一个字节;

2)ch和&ch值在 值 上是相等的,都等于首元素的地址。

3)*ch与ch[0]等价;*&ch与ch等价;

所以,*str 与ch是等价的!

int main()
{
    char ch[6] = "hello";
    char (*str)[6] = &ch;//数组名取地址表示一个指向整个数组的指针

    printf("%p\n", ch); //数组名指向的是第1个元素的首地址,即ch[0]的地址
	printf("%p\n", str); //输出数组ch的地址,此地址与ch[0]地址相同
    
    printf("%c\n", *ch); //输出的是ch[0]的值
    printf("%c\n", ch[0]); //输出的是ch[0]的值
    printf("%c\n", *(ch+1)); //输出的是ch[1]的值
    printf("%c\n", ch[1]); //输出的是ch[1]的值

	printf("%p\n", *str); //与ch等价,是ch[0]的地址
    printf("%c\n", (*str)[0]); //ch[0]的值
    printf("%c\n", (*str)[1]); //ch[1]的值

    printf("%c\n", **str);   //与ch[0]等价
    printf("%c\n", *str[0]); //str[0]是与ch等价,*str[0]与ch[0]等价
    printf("%c\n", *str[1]); //str[1]是与ch+1等价,*str[1]与(ch+1)[0]等价,但是ch+1未定义,                                
                              //所以会没有输出
    
}

 执行结果如下:

 

 2)数组指针指向一个二维数组的情况

由指向一维数组中最后所写的示例

 printf("%c\n", *str[1]); //str[1]是与ch+1等价,*str[1]与(ch+1)[0]等价,但是ch+1未定义,                                
                              //所以会没有输出
我们可以看出,由于是一维数组,str[1]没有定义,所以我们这里使str指向二维数组。 

  

 ch指向了二维数组的首元素ch[0],ch[0]又指向了6维数组的首元素ch[0][0];

 ch+1指向了二维数组的第1个元素ch[1],ch[1]又指向了6维数组的首元素ch[1][0];

int main()
{
    char ch[2][6] = {"hello","world"};
    char (*str)[6] = ch;//将二维数组的首元素的地址付给str

    printf("%p\n", ch); 
	printf("%p\n", str); //与ch等价
    
    printf("%p\n", *str); //输出的是ch[0]的值
    printf("%p\n", str[0]); //输出的是ch[0]的值
    printf("%p\n", *(str+1)); //输出的是ch[1]的值
    printf("%p\n", str[1]); //输出的是ch[1]的值

    printf("%s\n", *str); //输出的是ch[0]数组
    printf("%s\n", str[0]); //输出的是ch[0]数组
    printf("%s\n", *(str+1)); //输出的是ch[1]数组
    printf("%s\n", str[1]); //输出的是ch[1]数组
    
    return 0;
    
}

 运行结果如下:

2、指针数组

int main()
{
    char ch[2][6] = {"hello","world"};
    char *str[2];//两个指针

	for (int i = 0; i<2; i++)
		str[i] = ch[i];

  
    printf("%p\n", str[0]); //输出的是ch[0]的值
    printf("%p\n", str[1]); //输出的是ch[1]的值

    printf("%s\n", str[0]); //输出的是ch[0]字符串
    printf("%s\n", str[1]); //输出的是ch[1]字符串

 
    return 0;

}

 运行结果:

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

猜你喜欢

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