• C语言-再论指针与数组


    指针与数组的天生姻缘
    1、以指针方式来访问数组元素
    (1)、数组元素使用时不能整体访问,只能是单个访问。访问形式有两种:数组形式和指针形式。
    (2)、数组形式访问数组元素:数组名[下标];(下标从0开始
    (3)、指针格式访问数组元素:*(指针+偏移量);
    (4)、数组下标方式和指针方式均可以访问数组元素,两者的实质是一样的。在编译器内部都是用指针方式来访问数组的,
    数组下标方式只是编译器给编程者提供了一种壳而已。所以用指针方式来访问数组才是本质的做法。
    2、从内存角度理解指针访问数组的实质
    (1)、数组的特点就是:数组中各个元素的地址是依次相连的,而且数组还有一个很大的特点就是数组中各个元素的类型
    比较相同。类型相同就决定了每个数组元素占几个字节是相同的。
    (2)、数组中的元素其实就是地址相连接、占地大小相同的一串内存空间。
    这两个特点就决定了只要知道数组中一个元素的地址,就可以很容易推算出其他元素的地址。
    3、指针与数组类型的匹配问题
    (1)、int *p; int a[5];  p = a;    //类型匹配,a做右值等同于&a[0];
    (2)、int *p; int a[5];  p = &a;   //类型不匹配,p是int *,&a是整个数组的指针,也就是一个数组指针类型,不是
                                          int指针类型,所以不匹配。
    (3)、&a、a、&a[0]从数值上看是完全相等的,但是从意义上看就不同了。从意义上看,a和&a[0]是数组首元素首地址,
    而&a是整个数组的首地址;从类型上看,a和&a[0]是元素的指针,也就是int * 类型的;而&a是数组指针,是int (*)[5];类型。
    4、总结:指针类型决定了指针如何参与运算
    (1)、指针参与运算时,因为指针变量本身存储的数值是表示地址的,所以运算也是地址的运算。
    (2)、指针参与运算的特点就是:指针变量+1,并不是真的加1,而是加1*sizeof(指针类型);如果是int *类型,则+1就
    实际表示地址+4,如果是char *指针,则+1就表示地址+1;如果是double *指针,则+1就表示地址+8.

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5 
     6     int a[5] = {1,2,3,4,5};
     7     printf("a[3] = %d.
    ",a[3]);        //打印出结果是4
     8     printf("*(a+3) = %d.
    ",*(a+3));    //打印出结果是4;a在这里做右值,相当于
     9                                         //一个地址,a+3相当于地址加3
    10                                         //所以就相当于 int *p; p = a + 3; printf出*p;
    11     return 0;
    12 }
  • 相关阅读:
    typedef 函数指针的使用(含例子)
    关于计算机与MCU通信及MAX232、CH340T与PL2303的区别
    CH340电路设计
    USB转串口CH340接线方法
    开漏输出、推挽输出的区别
    STM32位带操作
    STM32启动文件:startup_stm32f10x_hd.s等启动文件的简单描述
    浮点数在内存中的存储方式
    stm32启动地址
    STM32三种启动模式 boot0 boot1
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11369308.html
Copyright © 2020-2023  润新知