一维数组 与  指针

1.C语言规定:如果指针变量p已指向同一数组中的下一个元素,见下:

定义: int dates[4],  *p;

那么:dates+2=&dates[2];

*(dates+2)=dates[2];

延伸:如果:p=&dates[n];

那么:p+i 就指向 &dates[n+i];

*(p+i)就指向 dates[n+i];

p-i 就指向 &dates[n-i];

*(p-i)就指向 dates[n-i];

例子: 函数1

int array_sum(int array, int n)

{

int sum=0, *p;

int *array.end=array+n

for(p=array;p

sum+=*p;

return(sum);

}

函数2

int array_sum(int array, int n)

{

int sum=0;

int i;

for(i=0;i

sum+=array[i];

return(sum);

}

总结:

C语言编译程序通常会将其中array[i]处理为*(array+i),

每次都要增加一次加法运算,效率就会低一些,所以使用指针访

问数组元素的主要原因。

#include

int array_sum(int array[], int n);

void main()

{

int a[10],i;

printf("请输入10个元素:\n");

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

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

printf("输入的元素是:\n");

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

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

printf("输入元素的和是:\n");

printf("%d",array_sum(a,10));

}

int array_sum(int array[], int n)

{

int sum=0, *p;

int *array_end=array+n;

for(p=array;p

sum+=*p;

return(sum);

}

二维数组与指针

数组都是按照行来存储的。

例如:

int a[3][4]={{10,20,30,40},{50,60,70,80},{90,91,92,93}};

则数组a有三个元素,分别为a[0],a[1],a[2].每个数组都是一维数组,

各包含4个元素。如a[1]的4个元素分别是:a[1][0]  a[1][1] a[1][2] a[1][3]

分解图:

数 组         --------------->

a        a[0]--------------->10   20    30    40

a[1]--------------->50    60    70    80

a[2]--------------->90    91    92    93

再如:

int *p=a[0];

则数组a的元素a[1][2]对应的指针为:  p+1*4+2

元素a[1][2] 也就可以表示为      :      *(p+1*4+2)

用下标表示法,a[1][2]表示为:          p[1*4+2]

对于二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同。

a[0] 是一维数组的名字,它指向的是a[0]数组的首元素。

*a[0]得到的是一个数组元素的值,即a[0]数组首元素的值。所以*a[0]和a[0][0]是一个值。

a   是二维数组的名字,它指向所有元素的首元素。它的每一个元素   都是一个行数组,

因此 它的指针移动单位是“行”,所以a+i指向的是第i行的数组。即指向a[i].

*a  得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。

备注:

当int *p; 定义指针p时,p是一个指向int型的数据,而不是一个地址,

所以 *p=a[0]是对的。

由上面可知道:

对于二维数组a,其a[0]数组由a指向,a[1]数组由a+1指向,以此类推:

a[i]的数组,由*(a+i)指向。

对于数组元素a[i][j],用

*(*(a+i)+j)  表示,指向该元素的指针为*(a+i)+j.

数组名虽然是数组的首地址,但数组名自定义的时候就确定了,不可以通过赋值老

改变。但指向数组的指针,指针变量的值可以改变,即它可以随时指向不同的数组

或同类型变量。

#include

int main()

{

int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};

int *p=a[0],max,row,col,i,j;

max=a[0][0];

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

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

{

if(*(p+i*4+j)> max)  //行存储

{

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

row=i;

col=j;

}

}

printf("a[%d][%d]=%d\n",row,col,max);

return 0;

}

二维数组指针:

数据类型 (*指针变量名)[二维数组列数]

对上述a数组,行数组指针定义如下:

int (*p)[4]

表示:

数组*p有4个int型元素,分别是(*p)[0] 、 (*p)[1]  、(*p)[2]  、(*p)[3]。

可用下列方式对指针赋值:

p=a;

赋值后p的指向:

p----------->10    11    12   13

p+1--------->20    21    22   23

p+2--------->30    31    32   33

修改上面的例子可以改成:

//题目:求二维数组元素的最大值,并确定最大值元素所在的行和列

//题目:求二维数组元素的最大值,并确定最大值元素所在的行和列

#include

int main()

{

int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};

int (*p)[4],max,row,col,i,j;

p=a;

max=a[0][0];

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

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

{

//if(*(p+i*4+j)> max)

if(*(*(p+i)+j)>max)       //修改的地方

{

//max=*(p+4*i+j);

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

col=j;

}

}

printf("a[%d][%d]=%d\n",row,col,max);

return 0;

}

备注: a[0]:是一维数组的名字,它指向的是a[0]数组的首元素。 a   :是二维数组的名字,它指向所有元素的首元素。

c语言指着与数组,C语言指针与数组相关推荐

  1. C语言中结构化数据(变量,指针,数组,字符串,结构体和联合)的内存表示

    目录 结构化数据表示 一.内存地址: 二.全局变量和局部变量的内存布局 三.数据在内存中的表示 四.数组在内存中的表示 五.字符串在内存中的表示 六.结构和联合在内存中的表示 结构化数据表示 一.内存 ...

  2. cout 数组_C++用指针访问数组元素(学习笔记:第6章 08)

    用指针访问数组元素[1] 数组是一组连续存储的同类型数据,可以通过指针的算术运算,使指针依次指向数组的各个元素,进而可以遍历数组. 定义指向数组元素的指针 定义与赋值 例: int 等效的形式 经过上 ...

  3. C语言九十五之实现经典的反转数组(通过指针或数组下标操作)

    1.题目 实现反转数组 比如数组 int a[] = {1, 2, 3, 4, 5}; 反转后得使得数组是这样 int a[] = {<

  4. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  5. C程序设计语言现代方法12:指针和数组

    目录 1. 指针的算术运算 1.1 概述 1.2 C语言支持的算术运算类型 2. 指针的比较 3. 指针用于数组处理 4. 数组名与指针 4.1 用数组名作指针 4.2 数组取下标操作 4.3 惯用法 ...

  6. C语言--指针和数组

    指针就是地址. 指针变量:是个变量,用来存放一个地址编号.(32位下,指针变量是4个字节) 对应类型的指针变量,只能存放对应类型的变量的地址. 扩展:char ch; ch占一个字节,它有一个地址编号 ...

  7. IOS笔记-C语言中的指针与数组

    1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型  *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p =  ...

  8. C语言指针和数组的天生姻缘

    指针和数组的天生姻缘 以指针的方式来访问数组 指针和下标访问数组的本质 数组和指针并不是相等的 从内存角度理解指针访问数组的实质 指针和数组类型的匹配问题 以指针的方式来访问数组 数组元素使用时不能整 ...

  9. C语言 指针和数组区别 - C语言零基础入门教程

    目录 一.前言 二.指针和数组区别 1.通过 sizeof 获取大小 a.计算数组大小 b.计算指针大小 2.指针和数组赋值方式不同 a.指针赋值 b.数组赋值 3.指针是指针变量,数组是指针常量 三 ...

  10. C语言—字符串与字符数组,字符串数组与字符串指针的区别

    字符串与字符数组 字符串一定是一个char的数组,但char的数组未必是字符串.--以字符'\0'结尾的char数组就是一个字符串,但如果char数组没有以'\0'结尾,那么就不是一个字符串,只是普通 ...

最新文章

  1. IDEA坑爹跟新的小BUG解决之道
  2. 【Java】MyBatis与Spring框架整合(一)
  3. windows下的文本文件在linux下查看,中文显示乱码
  4. Android + Eclipse + PhoneGap 2.9.0 安卓最新环境配置,部分资料整合网上资料,已成功安装....
  5. ecmsadmin.php空白,帝国CMS 后台登录空白 处理方法一则
  6. Linux系统管理员的Bash指南,11条Bash实践经验!
  7. 【jquery系列|Jquery总结篇】包含各种实例,文末有彩蛋!
  8. 剑指offer——python【第16题】合并两个有序链表
  9. lc滤波器是利用电感的感抗_电感器在电路中的应用特性
  10. sql 删除重复数据 只留一条
  11. 温度控制pid c语言程序,51单片机温度PID算法(C程序)
  12. 信号处理:时域和频域的关系
  13. 红警2科技时代V2.5d+Win10红警黑屏补丁
  14. DataSource 详解
  15. linux 微信不能发图片,微信回应发原图泄露位置信息​;元旦起 AI 造假音视频不得随意发布...
  16. 分布式系统论文精读2:GFS
  17. iA Writer for Mac(mac好用的写作软件)
  18. 团队项目(2.4) -- 《基于瞳孔检测的注意力检测研究》文献综述
  19. 秦皇岛楼市迎来打折潮商家急于回笼资金
  20. 关于计算机全景图的试题,计算机视觉实战篇—全景图制作

热门文章

  1. com.fasterxml.jackson将对象序列化成json时,出现在json里的属性名称是怎么来的
  2. SAP CRM Fiori My note应用 add to -append Frontend implementation
  3. metadata model entry in /IWFND/CL_MED_MDL_SVC_GRP
  4. AWS load balancer
  5. Embedded web server initialization - jar file default-mimetypes.properties
  6. SAP OData实现错误消息:OPPORTUNITIES_GET_ENTITY not implemented in data provider class
  7. 在TCP客户端连接成功的回调函数里,无法访问到客户端套接字的明细
  8. 一个程序员必须学会的Github使用技巧
  9. SAP UI5框架渲染的顺序
  10. 在Windows笔记本上调试运行在iOS设备上的前端应用