C语言 : 指针与数组

目录

 一维数组与指针

一维数组与指针之间的使用:

二维数组与指针

二维数组与指针之间的使用:

总结:


        在c语言中指针与数组的关系十分密切,通过数组下标所能完成的任何操作通过指针都可以实现。用指针编写的程序要比用数组下标编写的程序执行速度快。


 一维数组与指针

        定义一个一维数组,系统会在内存中为该数组分配一个存储空间,其数组的名字就是数组在内存的首地址。若再定义一个指针变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组。

例如:
int *p,a[10];
p=a;

a是数组名,同时也就是数组首地址,将它赋给指针变量p。(将数组a的首地址赋给p)

int *p,a[10];
p=&a[0];

        这两条幅值语句效果都是将数组a中的首个元素的地址赋给变量p。

一维数组与指针之间的使用:

        1)p+n与a+n:数组元素a[n]的地址(&a[n])。

                对于a这个数组而言,共有10各元素,n的取值为0~9,则对数组元素地址可以表示:p+0~p+9或a+0~a+9.

        2)如何来表示数组中的元素用到前面介绍的数组元素的地址表示:*(p+n)和*(a+n)来表示数组中的各元素。

        3)表示指针移动:“++”“--”运算符

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *p;
    int i,a[10];
    p=a;
    printf("请输入十个元素:\n");
    for(i=0;i<10;i++)
        scanf("%d",a+i);
    printf("该数组中的元素为:\n");
    for(i=0;i<10;i++)
        printf("%5d",*(p+i));
    return 0;
}

1、使用指针修改数组元素       

int array[2];
int *p;
p = array;
// 或 p = &a[0];

*p = 5;

printf("a[0]=%d\n", a[0]);    // 输出:a[0]=5

2、使用指针遍历数组

// a、平常我们是这样遍历数组的
int array[3] = {1, 2, 3};
for(int i=0; i<3; i++) {
    printf("a[%d]=%d\n", i, a[i]);
}

// b、用指针可以这样遍历数组
// 如果 p 是指向数组array的首元素array[0]
// 那么 p+1 则会根据数据类型 int 从而指向数组array的第二个元素array[1]
// 在16位编译器环境下,p+1代表增加2个字节
int *p = array;
for(int i=0; i<3; i++) {
    printf("a[%d]=%d\n", i, *(p+i));
}

// c、指针遍历2
// 此种方法相比于上一种方法不同的是:上一种方法指针p不变,而这种p每循环一次就改变一个
for(int i=0; i<3; i++) {
    printf("a[%d]=%d\n", i, *(p++));
}

// d、指针遍历3
// 数组跟指针有着密不可分的关系,array[i]也可以写成*(array+i)
for(int i=0; i<3; i++) {
    printf("a[%d]=%d\n", i, *(array+i));
}

3、指针,数组与函数参数

// 定义一个修改数组首元素的函数
void change(char c[]) {
    c[0] = 0;
}

void main() {
    char a[3];
    change(a);    // 传入数组地址
    printf("a[0]=%d\n", a[0]);    // 输入:a[0]=10
}

// 也可传入指针
void main() {
    char a[3];
    char *p = a;
    change(p);    // 传入地址
    printf("a[0]=%d\n", a[0]);    // 输入:a[0]=10
}

// 当然,change函数还可以改成这样
void change(char *c) {
    *c = 10;
    // 或c[0] = 10;
}

1~3引用于(1、使用指针修改数组元素 ~3、指针,数组与函数参数):10、C语言 —— 指针与一维数组(指针数组与数组指针) - 写给未来的自己 - OSCHINA - 中文开源技术交流社区


二维数组与指针

二维数组与指针之间的使用:

        1)&a[0][0]既可以看作数组0行0列的首地址,同时也可以看作是二维数组的首地址。

                &a[m][n]就是第m行n列元素的地址

        2)a[0]+n:第0行第n个元素地址

        3)&a[0]是第0行的首地址,当然&a[n]是第n行的首地址

        4)a+n:第n行的首地址

        5)*(*(a+n)+m):第n行第m列元素

        6)*(a[n]+m):第n行第m列元素

        7)*(a+n) = a[n]

        8) a[n]+m:第n行第m个元素地址

        


 #include <stdio.h>
 main()
 { 
     int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ;
     int (*p)[4] = x, k = 1, m, n = 0;
     for(m=0; m < 2; m++) 
         n += *(*(p+m)+k);
     printf("%d\n",n);

总结:

一个通过数组和下标实现的表达式可等价地通过指针或偏移量实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捧一彼岸花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值