编程求最大值 用指针

来源:互联网 发布:公司开淘宝店要交税吗 编辑:程序博客网 时间:2024/05/21 14:44
#include"stdio.h"
#define M  3
#define N  2


int main()
{
int arr[N][M];
int n ;
int i,j,max = 0;
int
compare(int (*p)[M],int n);

printf("请输入六个数,回车结束:\n");
for(i = 0;i < N;i++)
for(j = 0;j < M;j++)
scanf("%d",&arr[i][j]);
max =
compare(arr,M*N);

printf("最大数为:%d",max);
return 0;
}



int
compare(int (*p)[M],int n)
{
int i,j,high;
high = **p;
for(i =0;i < N;i++)
for(j = 0;j < M;j++)
{
if(high < *(*(p+i)+j))
high = *(*(p+i)+j);
}
return high;

}

运行结果:

请输入六个数,回车结束:23

13

34

5879

98

45

最大数为:5879

源程序没有注释,平时没注意不是个好习惯!以后得好好注意!

读了一晚上二维数组的知识之后写下了这个程序,gcc编译通过。


数组指针     和    指针数组


数组指针   首先是一个指针  也称行指针   例如   char (*p)【N】;

定义了一个字符型的数组指针,因为【】的优先级比*高  ,所以必须用小括号括起来,小括号的优先级是最高的,那么p变量就是一个指针;

定义 type(类型) (*p)【N】 N通常是确定的

如下   int  ARR[M][N] ;

int (*p)[N] = ARR;

通过这样的话 (*p)[N] 指向二维数组的第0行 

           (*(p+1))[N] 指向二维数组的第一行 N表示列数 

   (*(p+2))[N] 指向二维数组的第二行

大概因为这样也有行指针的说法吧!ARR是二维数组的首地址,c语言规定数组名为首地址;


指针数组    顾名思义  是一个数组首先   example:  char *p[M] ;

数组指针 就是数组元素都是一个指针  

借用百度知道的一个例子来表达下:

仔细研读下面的程序:

#include <stdio.h>

int main(void)

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

 int (* p)[2];

 char * s[2] = {"hello", "world"};

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

printf("%s %s\n", s[0], s[1]);

 return 0;

}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、

如上面的程序  int(*p)[2]是一个数组指针 行指针

因此输出结果为:1,2,3,4  

int *s[2]是一个指针数组

s[0]存放“hello”字符串的首地址 

s[1]存放“world”字符串的首地址

因此输出结果为:hello world


然后就是二维数组的首地址与行地址,元素的地址的纠结

表达不好,例如:

int ARR[2][3];//定义一个2行3列的二维数组

ARR 数组名表示二维数组的首地址  ARR +1 则是第一行的首地址   

ARR[0],ARR[1];表示二维数组的第 0 行和第 1 行

*ARR     表示第0行首地址 


好 这样问题来了 ARR 表示二维数组的首地址 *ARR表示第0行0列的首地址  这两个地址是相同的

 常常会发问了 ARR和*ARR 怎么会是同一个值呢


谭浩强的书上大概是这样写的  一个二维数组

ARR 地址指向的是二维数组的行 ARR +1  指向下一行

*ARR 地址指向的是二维数组中指定行的列  *ARR+1 指向的是第0行第一列的元素  即ARR[0][1]的地址  如果要表示ARR[0][1]的值 直接*(*ARR+1);


*(ARR+i)+j      //第i行第j列的地址

*((*ARR+i)+j)   //第i行第j列的值


ARR二维数组的地址 *ARR不是表示ARR地址所指向的值 

只是指向不同

ARR是指向二维数组的行

*ARR是指向二维数组指定行的第几列  


谭浩强老师的书上的描述这个指向的例子很生动

就像学校里我们班点名签到一样

班长负责点这一个班的人是否到齐  正如ARR   他指向的是组长  问组长是否你这个组到齐

组长负责点自己所在的组的成员是否到齐 正如*ARR     他指向的是一个组的成员  他要一个一个的查到自己组的成员是否到齐


表达不清的错误的地方还望多多批评指正!我会再接再厉! 

原创粉丝点击