首页 > 其他分享 >C语言第15天,指针与多维数组

C语言第15天,指针与多维数组

时间:2022-09-22 20:14:54浏览次数:52  
标签:10 15 int C语言 pInt10 printf 多维 指针 pInt

## 数组名的转换规则

当数组名arr出现在一个表达式当中,数组名arr将会被转换为指向数组首元素的指针。

但是,这个规则有两个例外:

1.对数组名arr使用sizeof时。

2.对数组名arr使用&时。

 

多维数组和指针

1.首先, 我们来探究数组名。

#include<stdio.h>

int main()

{

int A[10];

int B[5][10];

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

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

return 0; }

结果为sizeof A=40

sizeof B=200

A、B的类型为都为整形数组,sizeof B=(4*10)*5=200

2.数组指针与指针数组

#include<stdio.h>

int main()

{int A[10];

int B[5][10];

类型1 pA;

类型2 pB;

pA=A;

pB=B;

return 0;}

数组名A、数组名B将会被转换为指向数组首元素的指针,之后赋值给pA或pB。

除了void*,不同指针类型之间不能直接相互赋值。因此,在表达式pA=A以及pB=B中,赋值运算符两边的指针类型必须一致。

int*pA;

int(*pB)[10];//int*pB[10]会被误认为有10个元素并且元素类型为int*的数组,即一个指针数组了。如果星号*和变量名被括号()包括,那么这是一个指针的声明。

 

3.数组指针的移动

#include<stdio.h>

int main()

{int B[5][10]={

{0,1,2,3,4,5,6,7,8,9},

{10,11,12,13,14,15,16,17,18,19},

{20,21,22,23,24,25,26,27,28,29},

{30,31,32,33,34,35,36,37,38,39},

{40,41,42,43,44,45,46,47,48,49}

};

 

int(*pInt10)[10]=B;//int[5][10]转换为int(*)[10]

 

printf("pInt10=%d\n",pInt10);//指向B[0][10]

printf("pInt10+1=%d\n",pInt10+1);//指向B[1][10]

printf("pInt10+2=%d\n",pInt10+2);//指向B[2][10]

printf("pInt10+3=%d\n",pInt10+3);//指向B[3][10]

printf("pInt10+4=%d\n",pInt10+4);//指向B[4][10]

return 0;}

 

数组名B的类型为int[5][10],但是它出现在初始化表达式中。所以,会被转换为指向首元素的指针,即int(*)[10]。

指针pInt10指向类型为int[10]的数组,所以指针pB移动的步长应当为sizeof(int[10]),即40。

 

 

4.对数组指针取值

类似于int*类型,对int*取值之后,可以获得int。

pB的类型为int(*)[10],对int(*)[10]取值之后,可以获得int[10]。即*plnt10,类型为int[10],是一个数组,空间大小为40。

既然*pInt10是一个数组,若出现在表达式中,又会从int[10]转换为首元素指针,即int*类型。

#include<stdio.h>

int main()

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

{10,11,12,13,14,15,16,17,18,19},

{20,21,22,23,24,25,26,27,28,29},

{30,31,32,33,34,35,36,37,38,39},

{40,41,42,43,44,45,46,47,48,49}

};

 

int(*pInt10)[10]=B; //int[5][10]转为int(*)[10]

 

printf("pInt10=%d\n",pInt10);

printf("pInt10+1=%d\n",pInt10+1);

 

int*pInt=*pInt10; //*pInt10从int[10]转换为int*

 

printf("pInt=%d\n", pInt);//指向B[0][0]

printf("pInt+1=%d\n", pInt+1);//指向B[0][1]

printf("pInt+2=%d\n", pInt+2);//指向B[0][2]

printf("pInt+3=%d\n", pInt+3);//指向B[0][3]

printf("pInt+4=%d\n", pInt+4);//指向B[0][4]

printf("pInt+5=%d\n", pInt+5);//指向B[0][5]

printf("pInt+6=%d\n", pInt+6);//指向B[0][6]

printf("pInt+7=%d\n", pInt+7);//指向B[0][7]

printf("pInt+8=%d\n", pInt+8);//指向B[0][8]

printf("pInt+9=%d\n", pInt+9);//指向B[0][9]

printf("pInt+10=%d\n", pInt+10);//指向B[1][0]

return 0;}

 

5.指针访问与下标访问等价

访问数组元素的两种办法:

1.数组名[下标]  2.*(数组名+偏移量)

但学完数组名出现在表达式中会转变为指针后可以得到一个更为通用的形式

1.指针[下标]

2.*(指针+偏移量)

#include<stdio.h>

int main()

{int B[5][10]={

{0,1,2,3,4,5,6,7,8,9},

{10,11,12,13,14,15,16,17,18,19},

{20,21,22,23,24,25,26,27,28,29},

{30,31,32,33,34,35,36,37,38,39},

{40,41,42,43,44,45,46,47,48,49}

};

 

int(*pInt10)[10]=B;//int[5][10]转为int(*)[10]

int*pInt=*pInt10;//*pInt10从int[10]转换为int*

 

printf("pInt[0]=%d\n",pInt[0]);//等价于*(pInt+0)

printf("pInt[1]=%d\n",pInt[1]);//等价于*(pInt+1)

printf("pInt[2]=%d\n",pInt[2]);//等价于*(pInt+2)

printf("pInt[3]=%d\n",pInt[3]);//等价于*(pInt+3)

printf("pInt[4]=%d\n",pInt[4]);//等价于*(pInt+4)

printf("pInt[5]=%d\n",pInt[5]);//等价于*(pInt+5)

printf("pInt[6]=%d\n",pInt[6]);//等价于*(pInt+6)

printf("pInt[7]=%d\n",pInt[7]);//等价于*(pInt+7)

printf("pInt[8]=%d\n",pInt[8]);//等价于*(pInt+8)

printf("pInt[9]=%d\n",pInt[9]);//等价于*(pInt+9)

printf("pInt[10]=%d\n",pInt[10]);//等价于*(pInt+10)

return 0;}

标签:10,15,int,C语言,pInt10,printf,多维,指针,pInt
From: https://www.cnblogs.com/mmwl/p/16719470.html

相关文章

  • CF1540B Tree Array 题解
    CF1540BTreeArray给定一棵\(n\)个节点的树。对于这棵树,我们通过下列方法来生成一个序列:等概率选择这\(n\)个节点中的一个节点,并对这个节点打上标记(初始时没有节......
  • C语言大小写转换
    #include<stdio.h>#include<string.h>intmain(){charstr[101];scanf("%s",str);inti;charc;//A-Z65-90//a-z97-122for(i=0;(c=str......
  • C语言上网计费系统模拟系统
    C语言上网计费系统模拟系统程序设计题2:上网计费系统模拟出题人:朱旻如面向专业:计算机学院难度等级:41问题描述本程序模拟根据上网清单、客户资料等生成客户上网账单......
  • PAT (Basic Level) Practice 1031 查验身份证 分数 15
    一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的......
  • PAT (Basic Level) Practice 1021 个位数统计 分数 15
    给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则......
  • PAT (Basic Level) Practice (中文)1015 德才论 分数 25
    宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其......
  • VScode中配置C语言/C++运行环境
    https://www.bilibili.com/video/BV1Cu411y7vT/?spm_id_from=333.337.search-card.all.click&vd_source=50f71b6f0ea6d5115ac14c7af4277547......
  • C语言进阶-动态内存管理
    C语言进阶之动态内存管理前言C语言一、为什么存在动态内存分配我们已经掌握的内存开辟方式有:intval=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间......
  • 13 刘欣晨 2022.9.15
    实验 一 项目名称:判断输入的是不是黄蓉所说的数实验内容:print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")number=int(input("请输入您认为符合......
  • extern的使用详解(多文件编程)——C语言
    extern——关键字extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用”,extern这个关键字大部分读者应该是在......