C语言tips-数组指针和指针数组

最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路

数组指针

概念:顾名思义就是一个指针,它指向的是一个数组,指向的是一个数组的首地址

我们来看下面这行代码:

#include <stdio.h>
#include <stdlib.h>


int main() {
  
  int a[3] = {1,2,3};
  // 这是一个数组指针
  int (*p1)[3] = &a;
  // 这是一个普通指针
  int *p2 = (int *)&a;
  printf("p1 = %d\n", p1);
  printf("p2 = %d\n", p2);
  printf("p1+1 = %d\n", ++p1);
  printf("p2+1 = %d\n", ++p2);
  return 0;
}

我们分别定义了一个数组指针和一个普通指针都指向一个地址,可以得到以下数据
在这里插入图片描述

当我们定义一个数组后,个指针变量将告诉我们两个信息:某个数据结构的起始地址以及该结构的跨度。比如 int p = &a; 说明该指针指向变量 a 的起始地址,以及它的跨度为 sizeof(int)。所以 p + 1 == p + sizeof(int),但是int (*p)[10] 虽然是定义一个整型指针,但不要忘了它后边还有一个数组,所以它的跨度应该是 sizeof(int) * 10,而 array 作为数组名,它的含义是“指向数组第一个元素的地址”,因此array&array虽然初始值是一样的但是代表的意义是不一样的,&array代表的是数组,详细解释可以参考c语言tips-c/c++中数组名和&数组名的区别

数组指针在二维数组的应用

我们来看下面这段代码

#include <stdio.h>

int main()
{
    int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
    int (*p)[3] = &a;
    p++;
    p++;
    return 0;
}

运行在可视化界面上
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们知道二位数组虽然在我们认值中是二维的,但是其在内存中的存储确实连续的,我们也可以把它看作三个连续的一位数组组成,我们可以定义一个数组指针对二维数组的三个一维数组进行访问, 因为它的自增的步长刚好为一个一维数组的长度。

指针数组

指针数组即是一个数组,数组的每一个元素都是一个指针

再写一段代码表示指针数组

int main() {
  int a = 1, b = 2, c = 3;
  int *p[3] = {&a, &b, &c};
  printf("a = %d, b = %d, c = %d", *p[0], *p[1], *p[2]);
  return 0;
}

在这里插入图片描述

在上述代码中我们定义了三个整型变量,然后定义了一个指针数组,指针数组的三个元素分别指向了三个整型变量,然后我们再取值时需要解引用得到

当然指针数组还有其他有趣的用法,由于字符串可以使用字符指针来存储,即我们可以用指针数组来存储字符串数组,来看以下代码

int main() {
  char* a = "aaaa";
  char* b = "bbbb";
  char* c = "cccc";
  int *p[3] = {a, b, c};
  for(int i = 0; i < 3; i++)
  {
    printf("%s\n", p[i]);  
  }
  return 0;
}

在这里插入图片描述

以上就是我对数组指针和指针数组的理解,欢迎大家评论交流!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值