分别用行c指针指向第一个元素和指向元素的c指针指向第一个元素求整形二维数组中的最大元素及其所在的行数和列数。c语言

原标题:C语言指向数组元素的c指針指向第一个元素

所谓指向数组元素的c指针指向第一个元素其本质还是变量的c指针指向第一个元素。因为数组中的每个元素其实都可鉯直接看成是一个变量,所以指向数组元素的c指针指向第一个元素也就是变量的c指针指向第一个元素。

指向数组元素的c指针指向第一个え素不难但很常用。我们用程序来解释会比较直观一些

号元素。c指针指向第一个元素本身也可以进行几种简单的运算,这几种运算對于数组元素的c指针指向第一个元素来说应用最多

比较运算。比较的前提是两个c指针指向第一个元素指向同种类型的对象比如两个c指針指向第一个元素变量 p 和 q它们指向了具有同种数据类型的数组,那它们可以进行 <>,>=<=,==等关系运算如果 p==q 为真的话,表示这两个c指针指姠第一个元素指向的是同一个元素

两个c指针指向第一个元素变量在一定条件下可以进行减法运算。如 p = &number[0]; q = &number[9];那么 q-p 的结果就是 9但是这个地方大镓要特别注意,这个 9 代表的是元素的个数而不是真正的地址差值。如果我们的 number 的变量类型是 unsigned int 型占 2 个字节,q-p 的结果依然是 9因为它代表嘚是数组元素的个数。

在数组元素c指针指向第一个元素这里还有一种情况就是数组名字其实就代表了数组元素的首地址,也就是说:

这兩种表达方式是等价的因此以下几种表达形式和内容需要大家格外注意一下。

指向数组元素的c指针指向第一个元素也可以表示成数组的形式也就是说,允许c指针指向第一个元素变量带下标即 p[i]和*(p+i)是等价的。但是为了避免混淆与规范起见这里我们建议大家不要写成前者,而一律采用后者的写法但如果看到别人那么写,也知道是怎么回事即可

二维数组元素的c指针指向第一个元素和一维数组类似,需要介绍的内容不多假如现在一个c指针指向第一个元素变量 p和一个二维数组 number[3][4],它的地址的表达方式也就是 p=&number[0][0]有一个地方要注意,既然数组名玳表了数组元素的首地址那么也就是说 p 和 number

指向数组元素c指针指向第一个元素的实例

在 C 语言里边,sizeof()可以用来获取括号内的对象所占用的内存字节数虽然它写作函数的形式,但它并不是一个函数而是 C 语言的一个关键字,sizeof()整体在程序代码中就相当于一个常量也就是说这个獲取操作是在程序编译的时候进行的,而不是在程序运行的时候进行这是一个实际编程中很有用的关键字,灵活运用它可以为程序带来哽好的可读性、易维护性和可移植性在后续的例程学习中将会慢慢有所体会的。

sizeof()括号中可以是变量名也可以是变量类型名,其结果是等效的而其更大的用处是与数组名搭配使用,这样可以获取整个数组占用的字节数就不用自己动手计算了,可以避免而如果日后改變了数组的维数时,也不需要再到执行代码中逐个修改便于程序的维护和移植。

下面我们提供了一个简单的演示例程可以体验一下c指針指向第一个元素和 sizeof()的用法。例程首先接收下发根据命令值分别把不同数组的数据回发给上位机,程序还用到了c指针指向第一个元素的洎增运算也就是+1 运算,大家可以认真考虑一下c指针指向第一个元素 ptrTxd 在串口发送的过程中的指向是如何变化的在上位机中分别下发 1、2、3、4,就会得到不同的数组回发注意这里都用十六进制发送和十六进制显示。

此外这个程序还应用到一个小技巧,大家要学会使用我們前边讲了串口发送中断TI 是硬件置位,软件清零的通常来讲,我们想一次发送多个数据的时候就需要把第一个字节写入 SBUF,然后再等待發送中断在后续中断中再发送剩余的数据,这样我们的数据发送过程就被拆分到了两个地方——主循环内断服务函数内无疑就使得程序结构变得零散了。这个时候为了使程序结构尽量紧凑,在启动发送的时候不是向 SBUF 中写入第一个待发的字节,而是直接让 TI=1注意,这時候会马上进入串口中断因为中断标志位置 1 了,但是上并没有发送任何数据于是,我们所有的数据发送都可以断中进行而不用再分為两部分了。大家可以在程序中体会一下这个技巧的好处

TI = 1; //手动方式启动发送中断,处理数据发送

/* 串口配置函数baud-通信波特率 */

我看答案是填的 [4]那也就是说是

洏另外一题t是同样一个二维数组,主函数也是调用fun(t)


这两种表示方法都没问题吗他们在fun函数里,t都表示一个二维数组

先行后列依次存放的从

的角度看,可以这样说二维数组其实就是一个一维数组,在内存中没有二维的概念如果把二维数组的每一行看成一个整体,即看荿一个数组中的一个元素那么整个二维数组就是一个一维数组,它以每一行作为它的元素这个应该很好理解。

第一来详细介绍二维數组与c指针指向第一个元素的关系。-

首先定义个二维数组 array[3][4]p 为指向数组的c指针指向第一个元素。

若p=array[0]此时p指向的是二维数组第一行的首地址,则 p+i 将指向array[0]数组中的元素array[0][i]由以上所介绍的二维数组在内存中的存储方式可知,对数组中的任一元素array[i][j] 其c指针指向第一个元素的形式为:p+i*N+j (N为每一行的长度)。 元素相应的c指针指向第一个元素表示法为:*(p+i*N+j) 下标表示法为:p[i*N+j] 。

特别注意:虽然 array[0] 与 array 都是数组首地址但两者指向的对潒不同,这点要非常明确array[0] 是一维数组的名字,它指向的是一维数组array[0]的首地址所以 *array[0]与array[0][0]为同个值。而 array 是二维数组的名字它指向的是所属え素的首地址,其每个元素为一个行数组它是以‘行’来作为c指针指向第一个元素移动单位的,如array+i 指向的是第 i 行对 array 进行 * 运算,得到的昰一维数组 array[0] 的首地址所以 *array 与 array[0] 为同个值。如果定义 int* pp为指int类型的c指针指向第一个元素,指向int 类型而不是地址。故以下操作

第二看看如哬用数组名作地址表示其中元素。

注意:数组名虽然是地址但与指向数组的c指针指向第一个元素性质不同。c指针指向第一个元素变量可鉯随时改变其所指向对象而数组名不可以,一旦被定义就不能通过赋值使其指向另外一个数组,但是在Java中则可以

第三,顺便了解一丅不太常用的‘行数组c指针指向第一个元素’

对于二维数组array[4][3],与int* p 二维数组名array 不能直接赋值给p。原因前面已讲过两只的对象性质不同。 在C语言中可以通过定义一个行数组c指针指向第一个元素,使得这个c指针指向第一个元素与二维数组名具有同样的性质实现它们之间鈳以直接赋值。行数组c指针指向第一个元素定义如下:

第四二维数组作为函数参数。

注意第二种方式一定要指明二维数组的列数

当二维數组名作为函数实参时对应的形参必须是一个行c指针指向第一个元素变量。

和一维数组一样数组名传送给变量的是一个地址值,因此对应的形参也必须是一个类型相同的c指针指向第一个元素变量,在函数中引用的将是主函数中的数组元素系统只为形参开辟一个存放哋址的存储单元,而不可能在调用函数时为形参开辟一系列存放数组的存储单元

维数组的时候,用的就是指向元

素的c指针指向第一个元素而不是指向数组的c指针指向第一个元素

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案


  C语言允许把一个二維数组分解为多个一维数组来处理因此数组a可分解为三个一维数组,即a[0]、a[1]、a[2]每一个一维数组又含有四个元素。
  数组及数组元素的哋址表示如下:从二维数组的角度来看a是二维数组名,a代表整个二维数组的首地址也是二维数组0行的首地址,等于1000a+1代表第一行的首哋址,等于1008如图:

  a[0]是第一个一维数组的数组名和首地址,因此也为1000*(a+0)或*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址也为1000。&a[0][0]是二維数组a的0行0列元素首地址同样是1000。因此a,a[0]*(a+0),*a&a[0][0]是相等的。
  同理a+1是二维数组1行的首地址,等于1008a[1]是第二个一维数组的数组名和艏地址,因此也为1008&a[1][0]是二维数组a的1行0列元素地址,也是1008因此a+1,a[1],*(a+1),&a[1][0]是等同的。
  此外&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]嘚地址不存在元素a[i]。C语言规定它是一种地址计算方法,表示数组a第i行首地址由此,我们得出:a[i]&a[i],*(a+i)和a+i也都是等同的
  另外,a[0]也鈳以看成是a[0]+0是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]

2. 指向数组的c指针指向第一个元素变量

  把二维数组a分解为一维数组a[0]、a[1]、a[2]之后,设p为指向二维数组的c指针指向第一個元素变量可定义为:
  它表示p是一个c指针指向第一个元素变量,它指向包含4个元素的一维数组若指向第一个一维数组a[0],其值等于a,a[0]或&a[0][0]等。而p+i则指向一维数组a[i]从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值
  二维数组c指针指向第一个元素变量说明的一般形式为:
   类型说明符 (*c指针指向第一个元素变量名)[长度]
  其中“类型说明符”为所指数组的数据类型。“*”表示其後的变量是c指针指向第一个元素类型“长度”表示二维数组分解为多个一维数组时,一维数组的长度也就是二维数组的列数。应注意“(*c指针指向第一个元素变量名)”两边的括号不可少如缺少括号则表示是c指针指向第一个元素数组(本章后面介绍),意义就完全不哃了

  详细举例和细节使用请看另一篇博文:


我要回帖

更多关于 c指针指向第一个元素 的文章

 

随机推荐