指针数组和数组指针有什么区别?

你好,很高兴您能读到这篇关于指针的博客,博客内容我将会以最简单的方式带您了解指针数组和数组指针的区别,那么开始正题。

指针数组,重点在于数组。例如我们常用的整形数组,字符数组等,它们的名字前半部分是存放数据的类型,后半部分是数组,所以,指针数组就是存放指针的数组。

我们看一下下面的小代码:

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    int* arr[2] = {&a,&b};
    return 0;
}

arr数组的元素是两个地址,两个地址在数组所开辟的空间内存放,所以需要一个整形指针的类型接收,在C语言操作符的优先级中定义:[]数组操作符 比 *指针操作符优先级高,根据结合性,[]与arr结合表明arr是一个数组,类型是int*。

我们再看一下下面的小代码:

#include <stdio.h>
int main()
{
    char str1[] = "hello world.";
    char str2[] = "hello world.";
    const char *str3 = "hello world.";
    const char *str4 = "hello world.";
    if(str1 ==str2)
         printf("str1 and str2 are same\n");
    else
         printf("str1 and str2 are not same\n");
       
    if(str3 ==str4)
         printf("str3 and str4 are same\n");
    else
         printf("str3 and str4 are not same\n");

    return 0;
}

答案是:not与are

我们知道数组在内存中是分配一块区域,地址是随机的,数组的元素从下标0开始所在的地址按由低到高的地址顺序存放,str1数组一块区域,str2数组一块区域,自然而然的把每个元素按顺序放在这个地址空间内,所以他们的地址是不同的。

str1与str2数组名表示首元素地址,记住除了&数组名与sizeof(数组名)之外都表示首元素地址,这两个操作符与数组名结合使用,数组名此时表示整个数组,&后+1跳过整个数组的字节,比如数组有10个元素,每个元素是int类型,*(&数组名+1)跳过40个字节.

字符指针变量初始化时只能存放一个指针类型(4/8)的字节,字符串"abcdef"表达式相等于首元素地址,a是一个字符,字符是个常量不能够被改变,a的地址存放在指针变量str3和str4中,所以str3与str4相等。

数组指针,重点在指针,意思为指向数组的指针,顾名思义,取出一个数组的地址,用数组指针的形式来接收

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int (*arr)[10] = &arr;
    return 0;
}

此时()操作符优先级最高,*与arr结合表示它是一个指针,指针类型是int [10],说明它是一个存放数组的指针,名为数组指针。

感谢您的阅读,若有所帮助,期待您点赞、分享这篇博客。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值