指针和数组的关系

指针和数组的关系

  数组名是一个指针常量,表示数组第一个元素的的起始地址。

 如 int a[5];  a表示数组第一个元素a[0]的起始地址&a[0]。

 

一 引用数组元素的方法

  ①用数组下标引用数组元素

  数组a中元素用下标表示为: 

  a[0] a[1] a[2] a[3] a[4]

  ②用指针引用数组元素

  数组a中元素用下标表示为:

  int *p = a;  

  *p, *(p+1), *(p+2), *(p+3), *(p+4)

二 数组和指针的关系

  ①既然p是指向数组第一个元素起始地址的指针,可以用*(p+i)表示数组中第i+1个元素,a也是指向数组第一个元素的指针啊,那么能不能用*(a+i)表示第i+1个元素呢?

  可以的,可以用printf 打印 *(a+i)的值验证

  ②反过来,a是指向数组第一个元素起始地址的指针,可以用a加数组下标引用数组元素,如a[3],p也是指向数组第一个元素起始地址的指针,能不能用p加数组下标引用数组元素?

  也是可以的,可以用printf 打印 p[0], p[1]....的值验证

PS: 由上得,数组名a和指针p是一样的。实际上编译时,数组元素a[i] 就是当作 *(a+i)去处理的,先通过数组名a找到数组的首地址,然后首地址 a+i 得到元素a[i]的地址,

  再然后通过*(a+i)得到第i个元素的内容。

  所以:数组的第i个元素直接写成*(a+i)的形式直接取得值,效率不就提升了吗。省去编译器先通过数组名a找到数组的首地址,然后首地址 a+i 得到元素a[i]的地址,

  再然后通过*(a+i)得到第i个元素的内容。

三 指向数组的指针的自增

  int a[5];

  int *p = a; 

  可以 ++p 递增指针p指向下一个数组元素,然后用*p取得元素的值。

  能不能用a++或者++a把指针指向下一个数组元素? 不能!!! 开头就说过,数组名是指向数组首元素的指针常量。指针a是不可以指向其他元素的,只能指向首元素的起始地址。

四 数组指针做形参

  把数组从主调函数传到被调函数时,我们可以传数组的首地址和数组长度就可以,为什么不是传递数组呢?还是为了效率,下面用代码说明:

  void Output(char *p, int len);

  int main()
  {
    char str[] = "HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld ";
    Output(str, strlen(str));
    system("pause");
    return 0;
  }

  void Output(char *p, int len)
  {
    for (int i = 0; i < len; ++i)
    {
      printf("%c", *(p + i));
    }
  }

如上,如果我们Output函数不是用指针的方式char *p,而是用数组的方式char p[]的话,有什么不一样?

我们定义的数组str有65字节,调用函数的话会传递这65字节的数组。

char *p指针大小是4字节,只需要传递4字节的数据就可以了,不止少传递数据,执行起来也更快了。

 

PS: 指针大小可以打印sizeof(int*),sizeof(char*)去验证。

posted on 2019-01-10 14:11 锋邢天下 阅读(...) 评论(...) 编辑 收藏

指针数组在计算机编程中密切相关,它们之间的关系可以从以下几个方面描述: 1. **数组名作为指针**:在大多数语言中,数组名本身就是对该数组首元素的地址(或者说指针),可以看作是一个指向数组首元素的常量指针。这意味着你可以使用数组名去间接访问数组的所有元素。 ```c int arr[5] = {1, 2, 3, 4, 5}; int* ptr = arr; // arr实际上就是一个指针,它指向第一个元素arr[0] ``` 2. **数组元素的访问**:通过指针,我们可以直接操作数组的每个元素,就像访问单个变量一样。比如 `ptr[i]` 就等同于 `arr[i]`。 3. **指针遍历数组**:由于数组连续存储的特点,通过指针可以方便地遍历整个数组,这对于算法设计和数据处理非常有用。 4. **数组长度和指针调整**:虽然数组名本质上是个指针,但我们通常不需要关心它的长度信息。但是如果你有一个指针,并且需要知道数组长度,你可以计算出从初始位置到数组末尾的距离(通常是`sizeof(arr)/sizeof(arr[0])`)。 5. **一维数组和动态分配的类似结构**:在某些情况下,我们可能会创建一个动态大小的数组,这时就更像一个动态分配的数组,通过指针对其进行操作。指针在这种情况下提供了一定的灵活性。 6. **指针数组**:数组也可以包含指针,形成指针数组,这允许你在数组中存储其他数组或对象的地址。 总的来说,数组指针可以互相转换使用,但理解和正确运用两者之间的关系对于高效编程至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值