C语言——指针和数组

8 篇文章 0 订阅

一.数组的指针
1.数组的指针也就是数组的地址,数组的指针在数字上面等价于数组第一个元素的指针。
比如:int a[5]; 数组的地址 == &a[0];

2.数组名的本质

int a[5];

  1. 数组名a 代表数组这种数据类型
  2. 数组名a 表示数组首元素的指针,a 是一个指针常量
    数组的地址 == &a[0] = a;

3.数组的另外一种遍历方式

int main(int argc, const char * argv[]) {

    int a[] = {1,2,3,4,5,6};

    int len = sizeof(a)/sizeof(a[0]);
    //下标法
    for (int i = 0; i < len; i ++)
        printf("%d ", a[i]);
    printf("\n");
//打印1,2,3,4,5,6
    //指针来遍历数组元素
    for (int i = 0; i < len; i ++)
        printf("%d ", *(a + i));
    printf("\n");
//打印1,2,3,4,5,6
    return 0;
}

二.指向数组的指针变量
1.概念:定义一个指针变量,该指针变量保存数组的地址,那么将该指针变量叫做指向数组的指针变量。
2.声明方式

int  a[5] = {1,2,3,4,5};
int *p = a;

3.数组指针变量作用
访问指针变量所指向的存储区域。另外,指针变量和一般变量一样,存放在它们之中的值是可以改变的,也就是说可以改变它们的指向。简单来说就是取值和修改值。

int main(int argc, const char * argv[]) {

    int a[5] = {1,2,3,4,5};
   
    // 指针变量p指向a
    int *p = a;
    //访问指针变量所指向的存储区域
    printf("*p = %d\n", *p);//*p = 1
    
    // 通过指针变量p间接修改变量a的值
    *p = 9;
    printf("修改后,a的值:%d\n", a[0]);//修改后,a的值:9

    return 0;
}

4.如何通过指向数组的指针变量 p 来操作数组
1.如何获取数组元素和数组原属的地址
数组元素的地址:
&a[i], a + i, &p[i], p + i
数组元素:
a[i], *(a + i), p[i], *(p + i)

int main(int argc, const char * argv[]) {
    
    int a[5] = {1,2,3,4,5};
    int *p = a;
    
    //数组元素的地址
    printf("&a[1] = %p\n,a + 1 = %p\n,&p[1] = %p\n, p + 1 = %p\n", &a[1],a + 1,&p[1],p + 1 );
    //数组元素
    printf("a[1] = %d\n,*(a + 1) = %d\n,p[1] = %d\n, *(p + 1) = %d\n", a[1],*(a + 1),p[1],*(p + 1));
    /***
     &a[1] = 0x7ffeefbff4b4
     ,a + 1 = 0x7ffeefbff4b4
     ,&p[1] = 0x7ffeefbff4b4
     , p + 1 = 0x7ffeefbff4b4
     a[1] = 2
     ,*(a + 1) = 2
     ,p[1] = 2
     , *(p + 1) = 2
     ****/
    
    return 0;
}

5.数组名和数组指针变量的区别?
数组名是一个常量,一旦数组定义了,那么数组的指针不能在更改。而数组指针变量,是一个变量,可以被反复的赋值。

int main(int argc, const char * argv[]) {
    
    int a[5] = {1,2,3,4,5};
    int b = 10;
    int *p = a;
    
     p = &b;//不会报错,数组指针变量p,是一个变量,可以被反复的赋值
//    a = &b;//会报错,a是一个常量,值是a[0]的地址,常量不能修改
    
    printf("p[0] = %d\n", p[0]);//10

    
    return 0;
}

三、数组、指针变量与函数参数
1.数组作为参数的表示方式
数组作为参数传递:

	     形参                           实参
1:		  数组 int a[]               数组名 arr
2:        数组 Int a[]               数组指针变量  p
3:        指针 int *a                数组名 arr
4:        指针 int *a                数组指针变量  p
void printArr(int a[], int len);
void printArr(int *a, int len);

int main(int argc, const char * argv[]) {
    int arr[5] = {6,7,8,9,0};
    int b[10] = {1,2,3,4,5,6,7,8,9,10};

    printArr(arr, 5);//实参数组名 arr
    printArr(b, 10);
    
    return 0;
}
//a是数组的地址,是指向数组的指针变量
void printArr(int *a, int len)//形参 指针 int *a 
//void printArr(int a[], int len)
{
    //printf("size(a) = %lu\n", sizeof(a)); //40B?
    for (int i = 0; i < len; i ++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

2.数组作为参数传递
1)本质
传递的是数组的首地址,因为传递的是数组的地址,所以不知道数组的长度。
2)完整的参数列表
数组的地址, 数组长度
(int *a, int len)
3) 数组能不能进行值传递,传递地址的好处。
数组只能进行地址传递。
传递地址有什么好处:
1)减少时间的浪费;
2)减少空间的浪费。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值