数组与指针(c语言)

一.利用指针遍历一维数组
1.指针遍历数组元素的地址
因为数组所在的空间是连续的,存储的数据类型也是一样的,所以可以先通过让指针指向数组首元素的地址,然后再对p进行加减运算,即p可以访问数组元素中的地址。

 int a[5] = {1, 5, 7, 9, 3};
 int *p = &a[0];
 //p+i==&a[0]+i;
 //p+i的操作不改变原来p的指向,还是指向数组首元素的地址。
 printf("%p,%p,%p.%p,%p\n", p, p + 1, p + 2, p + 3, p + 4);
 printf("%p,%p,%p,%p,%p\n", &a[0], &a[1], &a[2], &a[3], &a[4]);
 printf("%p\n", p);

 //还可以通过自加的方式,++p,这样会改变p的指向。
 printf("%p  ", p);
 printf("%p  ", ++p);
 printf("%p  ", ++p);
 printf("%p  ", ++p);
 printf("%p  ", ++p);
 printf("%p \n", p);

运行结果:
在这里插入图片描述2.指针遍历一维数组的数据

for (int i = 0; i < 5; i++)
{
   printf("%d  ", *(p + i));
   printf("%d  ",*p+i);
   printf("%d  ", *p++);
}

*(p+i)相当于a[i]。说明,必须有括号,因为运算符的优先级比+的优先级高,如果不加(),那p+i,相当于数组首元素加i。
运行结果:*(p+i)的结果为1,5,7,9,3;
*p++的结果为1,5,7,9,3;
*p+i的结果为1,2,3,4,5。
注意:*(p+i)*p+i都没有改变p的指向,都是指向数组首元素的地址。而*p++改变了p的指向。

3.指针与下标运算
下标运算:是一个运算符,地址+[偏移量]。数组和指针都可以使用。
例如:

for (int i = 0; i < 5; i++)
{
   printf("%d,%d\n", a[i], p[i]);
}

p[i]和a[i]是等价的,运行结果:
在这里插入图片描述注意:数组名字a不能被赋值,只能参与运算;指针p可以参与运算,也能被赋值,指向新的空间。

二.指针数组和数组指针。

1.指针数组

int* a[5];

每个数组元素都是装地址,也可以称为地址数组。

 int b = 2,
     c = 5,
     d = 7,
     e = 4,
     f = 9;
    int *a[5] = {&b, &c, &d, &e, &f};
    printf("%d\n", e);
    //重新赋值
    *a[3] = 12;
    printf("%d\n", e);

运行结果:
4
12

应用简单数组的拉链结构:指针数组的数组元素存放的是别的数组的首元素地址。

    int b[2] = {1, 2};
    int c[3] = {3, 4, 5};
    int d[4] = {6, 7, 8, 9};
    int e[5] = {10, 11, 12, 13, 14};
    int f[6] = {15, 16, 17, 18, 19, 20};
    int *a[5] = {b, c, d, e, f};
    //等价于 int* a[5]={&b[0],&c[0],&d[0],&e[0],&f[0]};
    //访问12
    printf("%d\n", a[3][2]);
    system("pause");
    return 0;

运行结果:12

访问格式与二维数组相同,但内存结构不同,二维数组的内存是连续的,而数组的拉链结构的不一定连续,还有二维数组的大小是必须相同的,数组的拉链结构每个小数组的大小可以不同,但类型一定要相同。

2数组指针:数组类型的指针,指针指向数组类型。
分解定义:(*p)是一个指针,不加()是p先跟[]结合,为数组。int [5],p所指向的类型,数组类型。即int [5]*p,但是c语言不怎么写,应该写成int (*p)[5]。元素个数必须一样,否则为不同类型的数组指针,如int (*p)[5]和int (*p)[6]是两种不同类型的地址。

 int a[5] = {3, 5, 6, 7, 2};
 int *p = &a[3];   //数组元素地址。
 int(*p1)[5] = &a; //数组地址。
 //*p==a;
 printf("%d,%d\n", (*p1)[2], a[2]);
 printf("%p,%p\n", &(*p1)[2], &a[2]);

运行结果:
在这里插入图片描述主要用于函数参数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值