c语言指着与数组,C语言指针与数组
一维数组 与 指针
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语言指针与数组相关推荐
- C语言中结构化数据(变量,指针,数组,字符串,结构体和联合)的内存表示
目录 结构化数据表示 一.内存地址: 二.全局变量和局部变量的内存布局 三.数据在内存中的表示 四.数组在内存中的表示 五.字符串在内存中的表示 六.结构和联合在内存中的表示 结构化数据表示 一.内存 ...
- cout 数组_C++用指针访问数组元素(学习笔记:第6章 08)
用指针访问数组元素[1] 数组是一组连续存储的同类型数据,可以通过指针的算术运算,使指针依次指向数组的各个元素,进而可以遍历数组. 定义指向数组元素的指针 定义与赋值 例: int 等效的形式 经过上 ...
- C语言九十五之实现经典的反转数组(通过指针或数组下标操作)
1.题目 实现反转数组 比如数组 int a[] = {1, 2, 3, 4, 5}; 反转后得使得数组是这样 int a[] = {<
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C程序设计语言现代方法12:指针和数组
目录 1. 指针的算术运算 1.1 概述 1.2 C语言支持的算术运算类型 2. 指针的比较 3. 指针用于数组处理 4. 数组名与指针 4.1 用数组名作指针 4.2 数组取下标操作 4.3 惯用法 ...
- C语言--指针和数组
指针就是地址. 指针变量:是个变量,用来存放一个地址编号.(32位下,指针变量是4个字节) 对应类型的指针变量,只能存放对应类型的变量的地址. 扩展:char ch; ch占一个字节,它有一个地址编号 ...
- IOS笔记-C语言中的指针与数组
1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型 *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p = ...
- C语言指针和数组的天生姻缘
指针和数组的天生姻缘 以指针的方式来访问数组 指针和下标访问数组的本质 数组和指针并不是相等的 从内存角度理解指针访问数组的实质 指针和数组类型的匹配问题 以指针的方式来访问数组 数组元素使用时不能整 ...
- C语言 指针和数组区别 - C语言零基础入门教程
目录 一.前言 二.指针和数组区别 1.通过 sizeof 获取大小 a.计算数组大小 b.计算指针大小 2.指针和数组赋值方式不同 a.指针赋值 b.数组赋值 3.指针是指针变量,数组是指针常量 三 ...
- C语言—字符串与字符数组,字符串数组与字符串指针的区别
字符串与字符数组 字符串一定是一个char的数组,但char的数组未必是字符串.--以字符'\0'结尾的char数组就是一个字符串,但如果char数组没有以'\0'结尾,那么就不是一个字符串,只是普通 ...
最新文章
- IDEA坑爹跟新的小BUG解决之道
- 【Java】MyBatis与Spring框架整合(一)
- windows下的文本文件在linux下查看,中文显示乱码
- Android + Eclipse + PhoneGap 2.9.0 安卓最新环境配置,部分资料整合网上资料,已成功安装....
- ecmsadmin.php空白,帝国CMS 后台登录空白 处理方法一则
- Linux系统管理员的Bash指南,11条Bash实践经验!
- 【jquery系列|Jquery总结篇】包含各种实例,文末有彩蛋!
- 剑指offer——python【第16题】合并两个有序链表
- lc滤波器是利用电感的感抗_电感器在电路中的应用特性
- sql 删除重复数据 只留一条
- 温度控制pid c语言程序,51单片机温度PID算法(C程序)
- 信号处理:时域和频域的关系
- 红警2科技时代V2.5d+Win10红警黑屏补丁
- DataSource 详解
- linux 微信不能发图片,微信回应发原图泄露位置信息​;元旦起 AI 造假音视频不得随意发布...
- 分布式系统论文精读2:GFS
- iA Writer for Mac(mac好用的写作软件)
- 团队项目(2.4) -- 《基于瞳孔检测的注意力检测研究》文献综述
- 秦皇岛楼市迎来打折潮商家急于回笼资金
- 关于计算机全景图的试题,计算机视觉实战篇—全景图制作
热门文章
- com.fasterxml.jackson将对象序列化成json时,出现在json里的属性名称是怎么来的
- SAP CRM Fiori My note应用 add to -append Frontend implementation
- metadata model entry in /IWFND/CL_MED_MDL_SVC_GRP
- AWS load balancer
- Embedded web server initialization - jar file default-mimetypes.properties
- SAP OData实现错误消息:OPPORTUNITIES_GET_ENTITY not implemented in data provider class
- 在TCP客户端连接成功的回调函数里,无法访问到客户端套接字的明细
- 一个程序员必须学会的Github使用技巧
- SAP UI5框架渲染的顺序
- 在Windows笔记本上调试运行在iOS设备上的前端应用