一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变訪问数组的方式

jzdwajue jzdwajue     2022-08-28     694

关键词:

??
  1. 打印数组中的每一个元素,打印每一个元素的地址:

#include <stdio.h>

#include <stdlib.h>

 

void main(void)

{

    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节

    {

        printf(" %p,%d", p, *p);

    }

    getchar();

}

  1. 指针数组

#include <stdio.h>

#include <stdlib.h>

 

void main(void)

{

    //轮询数组的时候。能够用指针轮询

    //通过指针数组。能够管理地址

    char *str[5] = { "calc", "notepad", "tasklist", "pause", "mspaint" };

    for (char **pp = str; pp < str + 5;pp++)

    {

        system(*pp);

    }

    getchar();

}

  1. 数组指针(等价于二维数组)

#include<stdio.h>

#include<stdlib.h>

int main(int argc, char *argv[])

{

    //二维数组,等价于二级指针

    char str[5][10] = { "calc", "notepad", "tasklist", "pause", "mspaint" };

    printf("%p",str);

    for (char(*p)[10] = str; p < str + 5;p++)

    {

        //打印地址   字符串

        printf(" %p,%s",p,p);

        system((char *)p);

    }

    return 0;

}

  1. 二维数组

#include<stdio.h>

#include<stdlib.h>

int main(int argc,char *argv[])

{

    char str[5][10] = { "calc", "notepad", "tasklist", "pause", "mspaint" };

    //指针地址一样,可是类型不一样

    //str代表行地址。&str代表整个数组的地址。*str就是第一个字符的地址

    printf("%p,%p,%p",str,&str,*str);

 

    system("pause");

    return 0;

}

  1. 二维数组的开辟方式已经打印:

#include<stdio.h>

#include<stdlib.h>

 

int main(int argc,char *argv[])

{

    //开辟二维数组的空间

    int **p;

    p = (int **)malloc(sizeof(int)* 10);

    int i,j;

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

    {

        p[i] = (int *)malloc(sizeof(int)* 10);

    }

    //初始化数组

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

    {

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

        {

            *(*(p + i) + j) = i * j;

        }

        putchar(10);

    }

 

    //通过指针的方式打印出二维数组

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

    {

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

        {

            printf("%d ", *(*(p + i) + j));

        }

        putchar(10);

    }

 

    system("pause");

    return 0;

}

  1. 指针的加减法:

#include <stdio.h>

#include<stdlib.h>

 

int main(int argc,char *argv[])

{

    //c语言运算规则。加法原则实际加上的是:元素的大小*加上的数

    //减法原则实际上减去的是:元素的大小*减去的数              

    int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

    printf("%p ",a);

    int *p1 = &a[0][0];

    int *p2 = p1 + 4;

    printf("%d ",*p2);

    int *p3 = p2 - 3;

    printf(" %d", *p3);

    printf(" %d", p2 - p3);

 

    system("pause");

    return 0;

}

  1. 二维数组的打印问题

#include <stdio.h>

#include<stdlib.h>

 

int main(int argc,char *argv[])

{

    //c语言运算规则,加法原则实际加上的是:元素的大小*加上的数

    //减法原则实际上减去的是:元素的大小*减去的数              

    int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

    //将数组中的每一个元素一个个打印出来

    for (int *p = &a[0][0]; p < &a[0][0] + 12; p++)

    {

        //以下的一句实现的是每过4个元素换行一下

        if ((p - &a[0][0]) % 4 == 0)

        {

            printf(" ");

        }

        printf("%5d",*p);

    }

    printf(" ");

    //a是一个常量的行指针。a的类型与px等价

    int(*px)[4] = a;

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

    {

        for (int j = 0; j < 4;j++)

        {

            //printf("%5d",a[i][j]);     //通过数组名的方式实现打印

            //printf("%5d",px[i][j]);    //通过指针下标的方式实现

            //printf("%5d",*(px[i]+ j));//通过指针的方式实现

            printf("%5d",*(*(px+i)+j));  //通过下标的方式实现

        }

        printf(" ");

    }

 

    system("pause");

    return 0;

}

  1. 结构体数组

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

 

struct pos{

    int x;

    int y;

};

 

struct pos pos2[8] = {

    { 100, 200 },

    { 100, 0 },

    { 200,400 },

    { 300,600 },

    { 390,600 },

    { 190,900 },

    { 990,100},

    {1390,600}

};

 

struct pos pos1[8][2] = {

    { { 200, 0 }, { 900, 800 } },

    { { 0, 0 }, { 800, 1300 } },

    { { 1500, 200 }, { 600, 900 } },

    { { 800, 700 }, { 700, 800 } },

    { { 300, 100 }, { 600, 700 } },

    { { 900, 800 }, { 700, 700 } },

    { { 100, 200 }, { 800, 800 } }

};

 

void main()

{

    HWND *win = FindWindowA("Notepad++", "Notepad++");

    if (win == NULL)

    {

        return;

    }

    SetWindowPos(win, NULL, 0, 0, 100, 300, 1);

 

    for (int i = 0; i < 8; i++)

    {

        //设置窗体位置大小

        SetWindowPos(win, NULL, pos1[i][0].x, pos1[i][0].y, pos1[i][1].x, pos1[i][1].y, 1);

        Sleep(3000);

    }

    system("pause");

}

  1. 作为通过函数改变二维数组中各各參数的值,和打印相关的知识点

#include <stdio.h>

#include <stdlib.h>

/************************************************************************/

/* 一维数组没有副本机制,二维数组也没有,数组作为參数都是传递地址       */

/************************************************************************/

int searchmax(int a[3][4])

{

    //通过数组传递过来的数组。求大小的时候都是432位系统情况)

    printf(" search = %d",sizeof(a));

    int b[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2 };

    printf(" search b = %d",sizeof(b));

   

    //以下開始求数组的最大值

    int max;   //存储最大的值

    max = a[0][0];

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

    {

        for (int j = 0; j < 4;j++)

        {

            if (a[i][j] > max)   //比較大小

            {

                //接收最大的地址

                max = a[i][j];

            }

        }

    }

    return max;

}

 

int main(int argc, char *argv[])

{

    int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2 };

    int max = searchmax(a);

 

    printf(" 二维数组的最大值为:%d ",max);

 

    system("pause");

    return 0;

}

  1. 求二维数组中元素的最小值

#include <stdio.h>

#include<stdlib.h>

int searchmin(int(*p)[4])

{

    //如果第一个是最小的

    //int min = p[0][0];

    //相同能够使用以下的方式实现

    int min = *(*(p + 0) + 0);

 

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

    {

        for (int j = 0; j < 4;j++)

        {

            //第一种方式通过数组下标的方式实现

            //if (p[i][j] <min)  //比較大小

            //{

            //  min = p[i][j]; //求出最小的数

            //}

 

            if (*(*(p +i) + j) < min)

            {

                min = *(*(p + i) + j);

            }

        }

    }

    return min;

}

 

int main(int argc,char *argv[])

{

    int a[3][4] = { 1, 2, 3, 4, 5, 16, -7, 8, 9, 10, 1, 2 };

 

    printf(" min = %d ",searchmin(a));

 

    system("pause");

    return 0;

}

  1. 通过指针的方式实现求二维数组中的最大值

#include <stdio.h>

#include<stdlib.h>

 

/************************************************************************/

/* 二维数组退化为一个指向有4个元素的数组的指针                         */

/************************************************************************/

static int searchmax(int(*p)[4])

{

    //存储最大值

    int max = p[0][0];

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

    {

        for (int j = 0; j < 4;j++)

        {

            if (p[i][j] > max)

            {

                max = p[i][j];

            }

        }

    }

    return max;

}

 

int main(int argc,char *argv[])

{

    int a[3][4] = { 1, 2, 3, 4, 5, 16, -7, 8, 9, 10, 1, 2 };

 

    printf(" min = %d ",searchmax(a));

 

    system("pause");

    return 0;

}

12.三维数组定义,并通过数组的方式打印出来

#include <stdio.h>

#include<stdlib.h>

 

void printArray(int a[3][4][5])

{

    int i,j,k;

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

    {

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

        {

            for (k = 0; k < 5;k++)

            {

                printf("%4d",a[i][j][k]);

            }

            printf(" ");

        }

        printf(" ");

    }

}

 

int main(int argc, char *argv[])

{

    int a[3][4][5];

    int num = 0;

    //求得数组的大小为240

    printf("%d ",sizeof(a));

 

    //线性初始化

    for (int *p = &a[0][0][0]; p < &a[0][0][0] + 60;p++)

    {

        *p = num;

        num++;

    }

 

    printArray(a);

 

    system("pause");

    return 0;

}

13.三维数组定义。并通过指针的方式打印出来

#include<stdio.h>

#include<stdlib.h>

 

static void printArray(int (*p)[4][5])

{

    int i, j, k;

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

    {

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

        {

            for (k = 0; k < 5;k++)

            {

                //printf("%4d",p[i][j][k]);

                printf("%4d",*(*(*(p+i)+j)+k));

            }

            printf(" ");

        }

        printf(" ");

    }

}

 

int main(int argc, char *argv[])

{

    int a[3][4][5];

    int num = 0;

    //线性初始化

    for (int *p = &a[0][0][0]; p < &a[0][0][0] + 60;p++)

    {

        *p = num;

        num++;

    }

   

    printArray(a);

    system("pause");

    return 0;

}

14.通过指针类型改变訪问数组訪问

#include<stdio.h>

#include<stdlib.h>

 

int main(int argc,char *argv[])

{

    //创建一维数组

    int *p = (int *)malloc(sizeof(int)* 40);

    for (int *px = p, i = 0; px < p + 40; px++,i++)

    {

        //赋值

        *px = i;

        //指针循环

        //printf("%d,%p ",*px,px);

    }

 

    int b[5][8];

    printf(" ");

    //指针类型决定了訪问的方式

    int(*pp)[8] = (int(*)[8])p;

    for (int i = 0; i < 5;i++)

    {

        for (int j = 0; j < 8;j++)

        {

            //printf("%5d",pp[i][j]);打印数据

            printf("%5d",*(*(pp+i)+j)); //pp[i][j]

        }

        printf(" ");

    }

 

    printf(" ");

    int(*ppp)[2][5] = (int(*)[2][5])p;

    for (int i = 0; i < 4; i++)

    {

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

        {

            for (int k = 0; k < 5;k++)

            {

                //打印元素

                //printf("%5d",ppp[i][j][k]);

                printf("%5d",*(*(*(ppp+i)+j) + k));

            }

            printf(" ");

        }

        printf(" ");

    }

 

    system("pause");

    return 0;

}

 

总结:以下左边定义的数组和右边的指针是等价的

数组

指针

数组訪问

指针訪问

int a[i]

int *p

a[i]

*(p + i)

int a[i][j]

int (*p)[j]

a[i][j]

*(*(p+i)+j)

int a[i][j][k]

int (*p)[j][k]

a[i][j][k]

*(*(*(p+i)+j)+k)

int a[i][j][k][l]

int (*p)[i][j][k]

a[i][j][k][l]

*(*(*(*(p+i)+j)+k)+l)

 

指针与一维数组和二维数组以及字符串指针数组的学习笔记

...已经注释了,看注释信息理解即可。说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并... 查看详情

educoder编程练习题解(结构体)

...   循环一    循环二    函数递归与嵌套函数    一维数组和二维数组    字符数组    指针一    指针二    结构体    文件结构体编辑与调试    顺序结构    选择结构一    选择结构二    循环一   ... 查看详情

一维数组复习,二维数组与多维数组

...分是多少,是谁的分数(注意姓名跟分数对应)运用两个一维数组:运用一个一维数组:  一个元素是一个点,一维数组是一条线,二维数组是一个面,三维数组是一个立体。二维数组:int[,]array=newint 查看详情

java的一维数组二维数组三维数组多维数组等。

这个数组可以看做新手学习,从一维数组到多维数组循环渐进,其实看起也很简单,一看便知,众所周知,一维、二维或许经常用到,用到二维以上应该就很少了。publicclasstest{publicstaticvoidmain(String[]args){/*一维数组*/intnum[]={0,1,2};... 查看详情

将二维指针数组中的字符串分配给一维指针数组

】将二维指针数组中的字符串分配给一维指针数组【英文标题】:Assigningastringfroma2-Dpointerarraytoa1-DPointerArray【发布时间】:2016-02-2022:29:02【问题描述】:目前,我只需要使用数组和指针来执行此操作(因此不需要结构或数据结构... 查看详情

多维数组与指针(代码片段)

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素,但在概念和使用上,多维数组的指针比一维数组的指针要复杂一些。可以认为二维数组是数组的数组。例:定义:inta[3][4]=1,2,3,4,5,6,7,8,9,10,11... 查看详情

碎碎念(代码片段)

...针数组3.数组指针4.二维数组5.二维数组是线性存储的(用一维数组方式打印)6.一维(二维)数组与数组指针7.二维数组做函数参数8.sizeof测试一维数组、二维数组1.typedef定义数组类型有typedef是类型,没有是变量typdefintA[8];=====typdefin... 查看详情

c语言数组(一维数组形参退化|二维数组形参退化|函数形参等价关系)(代码片段)

文章目录一、一维数组形参退化二、二维数组形参退化三、数组形参等价关系一、一维数组形参退化C中将一维数组作为参数,传递到函数中,该一维数组会退化为指针;将intarray[10]数组,作为参数,传递到函数中,voidfun(intarray[1000])与voi... 查看详情

深入理解一维数组与二维数组(代码片段)

一维数组与二维数组的传参接收一维数组的形参有三种形式voidfuc1(int*arr)voidfuc2(intarr[])voidfuc3(intarr[5])intmain() int*arr1[5]=0; fuc1(arr1); fuc2(arr1); fuc3(arr1); return0;可以用指针来作为形参(常用的方法)࿰ 查看详情

c语言指针指向一维数组与二维数组?

请问高人,想定义一个指针指向一个一维/二维数组,(一)double*a;doubledata[3]=1,2,3;a=data;编译正确(二)double*a;doubledata[3][3]=1,2,3,4,5,6,7,8,9;a=data;编译出错:error#515:avalueoftype"double(*)[3]"cannotbeassignedtoanentityoftype"double*"... 查看详情

指针与二维数组

...素是int[4]类型的;实质上int[4]就是一个拥有4个int元素的一维数组。事实上,二维数组名称的本质是:二维数组的首地 查看详情

《数据结构》之数组结构和链表

...概念{间接寻址就是二级指针的利用,指向指针的指针,一维数组,二维数组。间接寻址在此特指其一维数组的含义;间接寻址是一维和二维数组的组合。既保留了数组的许多优点,也获得了链表的众多特色。首先,可以根据索... 查看详情

c语言二级指针作为输入(二维数组|二维数组遍历|二维数组排序)(代码片段)

...构不同,二维数组的内存结构是整齐的连续的内存块,每个一维指针指向的内存块的大小都是相同的,并且这些内存块还是连续的;1、二维数组声明及初始化二维数组声明及初始化://I.二维数组chararray[4][10]="abc","123","... 查看详情

一维数组与二维数组的拼接与二维数组增加行

一维数组与二维数组的拼接numpy有很多的拼接函数。比如hstack和vstack等。网上又很多这样的总结帖子。但是两个数组能拼接的条件就是得满足两个数组的维度要相同。所以二维数组和一维数组拼接的时候需要使用newaxis将一维数组... 查看详情

c语言二级指针作为输入(二维数组|二维数组内存大小计算|指针跳转步长问题)(代码片段)

...组内存大小计算给定一个二维数组:该二维数组中有444个一维数组,每个一维数组有101010个char数据;//I.二维数组chararray[4][10]="abc","123","258","sfd";计算二维数组大小:404040字节;//求二维数组总的内存大小intarra... 查看详情

数组参数和指针参数

...二维数组参数同样存在退化的问题,二维数组可以看做是一维数组,二维数组中的每个元素是一维数组4.二维数组参数中第一维的参数可以省略5.C语言中无法向一个函数传递任意的多维数组6.为了提供正确的指针运算,必须提供... 查看详情

二维数组与数组指针

...地址,b[1]是1行首地址,b[0]可以赋值给int*的指针,即b[i]是一维数组的首地址,b[i][j]访问的i行第j个元素int*s=b[0];  下面的代码可以遍历数组,输出每个元素的首地址for(inti=0;i<6;i++)       & 查看详情

二维数组和指针

...个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组下面我们讨论指针和二维数组元素的对 查看详情