C语言进阶课程学习记录-第29课 - 指针和数组分析(下)


本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录

数组名与指针

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-数组形式转换

#include <stdio.h>

int main()
{
    int a[5] = {0};
    int* p = a;
    int i = 0;

    for(i=0; i<5; i++)
    {
        p[i] = i + 1;
    }

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

    printf("\n");

    for(i=0; i<5; i++)
    {
        i[a] = i + 10;//可行 
    }

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

    return 0;
}

/*
output:
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5

p[0] = 10
p[1] = 11
p[2] = 12
p[3] = 13
p[4] = 14

用指针+下标代替数组赋值,可行


*/

在这里插入图片描述

实验-数组名与指针的差异

//ext.c
int a[] = {1, 2, 3, 4, 5};
#include <stdio.h>

int main()
{
   // extern int a[];//case1
    /*
        output:
        &a = 00402000 //数组地址
        a = 00402000  //首元素地址
        *a = 1
    */
    extern int *a;//case2
    
    /*
    output:
    &a = 00402000
    a = 00000001
    */

    printf("&a = %p\n", &a);//
    printf("a = %p\n", a);//1
    printf("*a = %d\n", *a);//访问地址00000001 报错


    return 0;
}

在这里插入图片描述

实验-转化后数组名加一的比较

#include <stdio.h>

int main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int* p1 = (int*)(&a + 1);
    int* p2 = (int*)((int)a + 1);
    int* p3 = (int*)(a + 1);

    printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);

    return 0;
}



    /*
    output:

    小端 数据低位放在低地址中

      01 00 00  00    02 00 00  00     03 00 00  00    04 00 00  00     05 00 00  00

     5    33554432  3
    */

实验-数组名作为函数形参

#include <stdio.h>

void func1(char a[5])
{
    printf("In func1: sizeof(a) = %d\n", sizeof(a));

    *a = 'a';

    a = NULL;
}

void func2(char b[])
{
    printf("In func2: sizeof(b) = %d\n", sizeof(b));

    *b = 'b';

    b = NULL;
}

int main()
{
    char array[10] = {0};

    func1(array);

    printf("array[0] = %c\n", array[0]);

    func2(array);

    printf("array[0] = %c\n", array[0]);

    return 0;
}

    /*
    output:
In func1: sizeof(a) = 4
array[0] = a
In func2: sizeof(b) = 4
array[0] = b
数组名作为函数形参会退化为指针
    */

小结

数组名与指针仅使用方式相同
数组名的本质不是指针;指针的本质不是数组
数组名并不是数组的地址,而是数组首元素的地址
函数的数组参数退化为指针

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-11 20:18:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-11 20:18:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-11 20:18:05       87 阅读
  4. Python语言-面向对象

    2024-04-11 20:18:05       96 阅读

热门阅读

  1. Cmake学习笔记3

    2024-04-11 20:18:05       42 阅读
  2. Nginx 调优面试题

    2024-04-11 20:18:05       29 阅读
  3. [CF825F] String Compression 题解

    2024-04-11 20:18:05       37 阅读
  4. 蓝桥杯刷题文件(包含多道练习题)

    2024-04-11 20:18:05       37 阅读
  5. 5.安全列

    2024-04-11 20:18:05       38 阅读
  6. Day2 字符串哈希&KMP

    2024-04-11 20:18:05       34 阅读
  7. AI副业赚钱资讯合集

    2024-04-11 20:18:05       26 阅读
  8. Cloudflare是什么?有什么用途?怎么购买

    2024-04-11 20:18:05       32 阅读
  9. 构造函数不能作为虚函数

    2024-04-11 20:18:05       36 阅读