嵌入式C语言实战开发详解(三)

时间:2022-03-23 19:11:55

一、数组

1、一维数组

#include<stdio.h>

 

#define MAX_SIZE 3

int main()

{

    int a[MAX_SIZE] = {0};

int (*pa)[MAX_SIZE];

pa = a;

    int i;

    int *p = a;

 

    printf("a = %p\n",a);

    printf("&a = %p\n",&a);

 

    for(i = 0; i < MAX_SIZE; i++)

    {

        scanf("%d",&a[i]);

      //scanf("%d",a+i);

      //scanf("%d",p+i);

      //scanf("%d",&p[i]);

      //scanf("%d",p++);

      //scanf("%d",*pa+i);

    }

    p = a;

 

    for(i = 0; i < MAX_SIZE; i++)

    {

        printf("a[%d] = %d\n",i,a[i]);

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

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

      //printf("a[%d] = %d\n",i,p[i]);

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

      //printf("a[%d] = %d\n",i,&((*pa)[i]));

    }

    return 0;

}

 嵌入式C语言实战开发详解(三)

注明:

printf(“a = %p\n”,a);// 指针常量,数组元素首地址

printf(“&a = %p\n”,&a);//数组的元素

 

&a:对一维数组的数组名取地址等于数组的地址;

*(&a) = a :对一维数组的地址取值等于数组首元素的地址

 

2、二维数组

#include<stdio.h>

 

int main()

{

    int a[2][2] = {1,2,3,4};

    //int a[][2] = {1,2,3,4};

    

    printf("sizeof(a) = %d\n",sizeof(a));

 

    int i;

    int j;

 

    for(i = 0;i < 2; i++)

    {

        for(j = 0; j < 2; j++)

{

    scanf("%d",&a[i][j]);

    //scanf("%d",*(a+i)+j);

}

    }

    

    for(i = 0; i < 2; i++)

    {

        for(j = 0; j < 2; j++)

{

    printf("a[%d][%d] = %d\n",i,j,a[i][j]);

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

}

    }

 

    return 0;

}

 

嵌入式C语言实战开发详解(三)

二维数组名:首个一维数组的地址

*a:数组首元素的地址

*(*(a+i)+j):

a+i:第i+1个一维数组的地址

*(a+i):第i+1个一维数组首元素的地址

*(a+i)+ j:第i+1个一维数组的j+1个元素的地址

*(*(a+i)+j):第i+1个一维数组的第j+1个元素的值

 

3、三维数组

三维数组名:首个二维数组的地址

*(*(*(a+i)+j)+k):

 

a+i:第i+1个二维数组的地址

*(a+i):第i+i个二维数组的首个一维数组的地址

*(a+i)+j:第i+1个二维数组的第j+1个一维数组的地址

*(*(a+i)+j):第i+1个二维数组的第j+1个一维数组的首元素的地址

*(*(a+i)+j)+k:第i+1个二维数组的第j+1个一维数组的第k+1个元素的地址

*(*(*(a+i)+j)+k):第i+1个二维数组的第j+1个一维数组的第k+1个元素的值

 

 

4、字符的二维数组

#include<stdio.h>

 

int main()

{

    char src[3][100];

    char (*p_src)[3][100];

    p_src = &src;

 

    int i;

 

    for(i = 0; i < 3; i++)

    {

      //scanf("%s",src[i]);

        scanf("%s",(*p_src)[i]);

    }

 

    for(i = 0; i < 3; i++)

    {

        printf("src[%d][100] = %s\n",i,src[i]);

    }

 

    return 0;

}

 

p_src:数组指针变量,指向二维数组的地址

5、数组指针

int main()

{

char src[3][100] = {“hello1”,“hello2”,“hello3”};

char ptr[100] = “hello world”;

char ktr[2][3][100] = {...}

print_ptr(ptr);

 

    return 0;

}

传一维数组,用元素的指针来接

void print_ptr(char *ptr)

传二维数组,用一维数组的指针来接

void print_src(char (*src)[100])  //步长问题 **src不可以

传三维数组,用二维数组的指针来接

void print_ktr(char (*ktr)[3][100])

6、指针数组

该数组里的指针都是野指针,都必须要分配空间

#include<stdio.h>

int main()

{

int *pa[3];

int i;

for(i = 0; i < 3; i++)

{

pa[i] = (int *)malloc(sizeof(int));

scanf("%d",pa[i]);

printf("pa[%d] = %d\n",i,*(pa[i]));

}

return 0;

}


二维数组占用实际字节,指针数组占用4个字节

若出现**ptr 要么是指针变量的地址要么是指针数组


未完待续~~~