第29课 指针和数组分析(下)

数组的访问方式
第29课 指针和数组分析(下)_第1张图片
简单例子:

 #include "stdio.h"
int main()
{
    int a[5] = {0};
    *(a + 2)  = 3;
    *(a + 3)  = 4;
    printf("a[2] = %d\n",*(a + 2));
    printf("a[3] = %d\n",*(a + 3));
    return 0 ;
}

输出结果
3
4

例子29-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 ;
}

输出结果:
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

a和&a的区别
·a为数组首元素的地址
·&a为整个数组的地址
·a和&a的区别在于指针的运算
第29课 指针和数组分析(下)_第2张图片
分析:a+1 增加的步长只是一个元素的大小
&a+1 增加的步长是整个数组的大小

例子29-3:

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

输出结果:
5,33554432,3
分析:&a + 1 指向5后面一个元素,若p1[-1]为指向该数组的上一个元素

数组参数:
·数组作为参数时,编译器将其编译成对应的指针。
void(int a[]) ←→void f(int* a);
void(int a[5]) ←→void f(int* a);
结论:
一般情况下,当定义的函数中有数组参数时,需要定义另来标识数组的大小
例子29-4:
`#include "stdio.h"
void func1(char a[5])
{

printf("In fun1:sizeof(a) = %d\n",sizeof(a));
* a = 'a';
a = NULL;

}
void func2(char b[])
{

printf("In fun2: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]);

}
输出结果:
In fun1:sizeof(a) = 4
array[0} = a
In fun2:sizeof(b) = 4
array[0} = b
数组名是不可以被赋值的
数组作为参数是假的,是不存在的,其实是指针。
小结:
·数组名和指针仅使用方式相同
-数组名的本质不是指针
-指针的本质不是数组
·数组名并不是数组的地址,而是数组首元素的地址
·函数的数组参数退化为指针

你可能感兴趣的:(c)