手记

【九月打卡】第10天【养成记】嵌入式挑战第10天,C语言中的指针:指针和二维数组、数组指针和二维数组

课程章节:

课程名称:物联网/嵌入式工程师
章节名称:第2周之第三讲 1-11 至 1-14 C语言中的指针:指针和二维数组、数组指针和二维数组
讲师姓名:大白老师

课程内容:

C语言中的指针:指针和二维数组

二维数组基本概念

数据类型  变量名[行数][列数];

例如: 
int    a[3][2];

特点:
(1)数组名 a 
(2)数组元素:a[0][0],a[0][1] .... a[2][1]
(3)实际内存中的排列方式
-----------------------------
低地址        
                a[0][0]
                a[0][1]
                a[1][0]
                a[1][1]
                a[2][0]
                a[2][1]
高地址
认为理解为:
                                                 
                      a[0]    a[0][0]    a[0][1]
        a             a[1]    a[1][0]    a[1][1]
                      a[2]    a[2][0]    a[2][1]

=======================================================

指针数组和数组指针

指针数组是一个数组
数组指针是一个指针

指针数组

int  a = 10,b = 20,c = 30;
int *p[3] = {&a,&b,&c};

数组指针

本质上是一个指针变量,这个变量可以用来记录一个数组类型的地址
 
int a[3]; => 去掉名字,剩下的是类型, int [3]
&a => 表示获取数组类型的地址,此时这个地址类型是 int (*)[3];

int a[3][2];
a表示的地址中存放了三个一维数组类型的数据,此时这个地址的类型是 int (*)[2]

             a[0]    a[0][0]    a[0][1]
a            a[1]    a[1][0]    a[1][1]
             a[2]    a[2][0]    a[2][1]
                     
a[0]:{a[0][0],a[0][1]}  =>  int [2]
a[1]:{a[1][0],a[1][1]}  =>  int [2]
a[2]:{a[2][0],a[2][1]}  =>  int [2]

a <===> &a[0]
a[0] <===>  int [2]
&a[0] <==>  int (*p)[2]
a <===> &a[0] <===> int (*p)[2]
*a <==> *(&a[0]) ====>  *a<===>a[0]

*a <===> a[0] <====> &a[0][0] <===> int *
a[0][0] <===> int 
  
总结:
int a[3]; int b[3][2];
a  : int *       => a  + 1 移动1个元素,4byte
&a : int (*)[3]  => &a + 1 移动3个元素, 12byte

b  : int (*)[2]  => b  + 1 移动2个元素,8byte
b[0]:int *       => b[0]+1 移动1个元素,4byte
&b  :int (*)[3][2]=>&b + 1 移动6个元素,24byte

定义方式

数据类型 (*变量名)[元素的个数];
例如:
int (*p)[3];

移动

int (*p)[3];
数组指针每次移动的是一个数组的大小
p ++;// p移动了3个元素,12byte

转换

数组类型指针---加*---->普通类型指针
int (*p)[3];
p的类型int ()[3]----------- 加 * ---------->*p的类型是int *

代码示例

#include <stdio.h>

int main()
{
    int a[3];
    int b[3][2];

    printf("a  = %#x\n",a); // int *
    printf("&a = %#x\n",&a); // int (*)[3]
    printf("b  = %#x\n",b); // int (*)[2]
    printf("b[0] = %#x\n",b[0]); // int *

    printf("--------------------\n");

    printf("a  +   1 = %#x\n",a + 1); // int *
    printf("&a +   1 = %#x\n",&a + 1); // int (*)[3]
    printf("b  +   1 = %#x\n",b + 1); // int (*)[2]
    printf("b[0] + 1 = %#x\n",b[0] + 1); // int *
    
    return 0;
}

C语言中的指针:数组指针和二维数组

数组指针保存二维数组

int a[3][4];
int (*p)[4];

p = a;

公式
a[i][j] <=> *(a[i] + j) <=>*(*(a + i) + j)
p[i][j] <=> *(p[i] + j) <=>*(*(p + i) + j)

注意:
a是一个数组名,它标识数组的首地址,它是一个符号常量,不能修改
p是一个指针变量,它保存了二维数组的首地址,它是一个变量,可以修改
  • 思考?
    int a[3][2], 想要或的数组中a[1][1]值的方法有哪些?
                a[0]    a[0][0]    a[0][1]
a               a[1]    a[1][0]    a[1][1]
                a[2]    a[2][0]    a[2][1]
                
答案:
a[1][1] , *(a[1] + 1) , *(*(a + 1) + 1),
*(a[0] + 3)

代码示例

#include <stdio.h>

#define M 2
#define N 3

int main()
{
    // int a[2][3];               
    int a[M][N] = {10,20,30,40,50,60};

    int (*p)[N] = a; // p = a;

    // a[1][1] = 50
    printf("a[1][1] = %d\n",a[1][1]);
    printf("*(a[1] + 1) = %d\n",*(a[1] + 1));
    printf("*(*(a + 1) + 1) = %d\n",*(*(a + 1) + 1));

    printf("=======================================\n");

    printf("*(*(p + 1) + 1) = %d\n",*(*(p + 1) + 1));
    printf("*(p[1] + 1) = %d\n",*(p[1] + 1));
    printf("p[1][1] = %d\n",p[1][1]);
    return 0;
}

课后任务

练习

int a[2][3] = {10,20,30,40,50,60};
int (*p)[3] = a;

要求通过多种方式输出a数组中的数据

代码示例

#include <stdio.h>

int main()
{

    return 0;
}

学习笔记:

练习

char a1[] = "abcde";
char a2[] = "XYZBBQ";

char *p_array[] = {a1,a2,NULL};

1.要求把通过p_array把a1所有所有小写字符换成大写字符。
2.要求把通过p_array把a2所有所有大写字符换成小写字符。
3.输出a1和a2字符串的数据观察效果。

代码

#include <stdio.h>

int main()
{
    char a1[] = "abcde";
    char a2[] = "XYZBBQ";
    char *p_array[] = {a1,a2,NULL};
    char *t = NULL;

    for (int i = 0; p_array[i] != NULL; ++i)
    {
        for (t = p_array[i]; *t != '\0'; ++t)
        {
            *t = *t >= 'A' && *t <= 'Z' ? *t + 32 : *t - 32;
        }
        printf("a%d[] = %s \n",i+1,p_array[i]);
    }

    return 0;
}

课程评价:

学懂了这两个概念很有收获,但是还要多练习和多看还没有熟练掌握。
指针数组是一个数组
数组指针是一个指针

0人推荐
随时随地看视频
慕课网APP