[C]指针和数组分析(下)

一、数组名与指针

1.问题:
image

2.数组的访问访问方式
image

3.下标形式VS指针形式
image

4.编程实验1:数组的访问方式

#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;//等于a[i] = i+10
    }
    
    for(i=0; i<5; i++)
    {
        printf("p[%d] = %d\n", i, p[i]);
    }
    
    return 0;
}

输出:

image

5.编程实验2:数组和指针不同

#include <stdio.h>

//验证数组名是否是指针?
int main()
{
    extern int* a;//文件ext.c; 即int a[] = {1, 2, 3, 4, 5};
    
    printf("&a = %p\n", &a); //打印指针a的地址
    printf("a = %p\n", a);  //打印指针a的值
    printf("*a = %d\n", *a); //打印int的值

    
    return 0;
}

//结果出现断错误

说明数组和指针是完全不同的。

二.a和&a的区别

image

编程实例:指针运算经典问题

#include <stdio.h>

int main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int* p1 = (int*)(&a + 1); //&a是数组的地址;&a + 1指向最后元素5后面的位置
    int* p2 = (int*)((int)a + 1);
    int* p3 = (int*)(a + 1); //指向第二个元素
	.
    
    printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);//p1[-1] ==>*(p1-1),指向数组最后一个元素
    
    return 0;
}
// A. 数组下标不能是负数,程序无法运行
// B. p1[-1]将输出随机数,p2[0]输出2, p3[1]输出3
// C. p1[-1]将输出乱码, p2[0]和p3[1]输出2

输出:

扫描二维码关注公众号,回复: 4470262 查看本文章

image

分析:
image
其中,*p2的地址换算成十进制:

image

三.数组参数

image

实例分析:虚幻的数组参数

#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;
}

输出:

image

四、小结:

image

本文为听课笔记,课程出处:
https://item.taobao.com/item

猜你喜欢

转载自blog.csdn.net/qq_40416052/article/details/83994104