C---通过指针访问数组
C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素。
引入指针变量后,就可以用俩种方法来访问数组元素了。
如果p的初值为&a[0],则:
- P+i 和a+i 就是a[i]的地址,或者说它们指向a数组的第i个元素。
- *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。
- 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
根据以上叙述,引用一个数组元素可以用:
1.下标法:即用a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。
2.指针发:即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其初值p=a。
输出数组中的全部元素(下标法):
#include<stdio.h>
int main(void)
{
int a[],i,j=;
//先给数组赋值
for(i=;i<;i++,j++)
{
a[i]=j;
}
//输出数组
for(i=;i<;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
system("pause"); }
输出数组中的全部元素(通过数组名计算元素的地址,找出元素的值)
#include<stdio.h>
int main(void)
{
int a[],i,j=;
//先给数组赋值
for(i=;i<;i++,j++)
{
*(a+i)=j; //*(a+i)=a[i]
}
//输出数组
for(i=;i<;i++)
{
printf("a[%d]=%d\n",i,*(a+i));
}
system("pause"); }
输出数组中的全部元素(用指针变量指向元素)。
#include<stdio.h>
int main(void)
{
int a[],i,j=,*p;
p=a;//初始化赋值指针变量
//先给数组赋值
for(i=;i<;i++,j++)
{
*(p+i)=j; //*(a+i)=a[i]=*(p+i)
}
//输出数组
for(i=;i<;i++)
{
printf("a[%d]=%d\n",i,*(p+i));
}
system("pause"); }
#include<stdio.h>
int main(void)
{
int a[],i,*p=a; //先给数组赋值
for(i=;i<;)
{
*p=i; //*p=a[i]
printf("a[%d]=%d\n",i++,*p++);
} system("pause"); }
几个注意的问题
1)指针变量可以实现本身的值的改变。如p++是合法的,而a++是错误的,因为数组啊是数组名,它是数组的首地址,是常量。
2)要注意指针变量的当前值,请看下面的程序
找出错误
main(){
int *p,i,a[];
p=a;
for(i=;i<;i++)
*p++=i;
for(i=;i<;i++)
printf("a[%d]=%d\n",i,*p++);
}
改正
main(){
int *p,i,a[];
p=a;
for(i=;i<;i++)
*p++=i;
p=a;
for(i=;i<;i++)
printf("a[%d]=%d\n",i,*p++);
}
从上例可以看出,虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。
3)*p++,由于++ 和*同优先级,结合方向自右而左,等价于*p(++)。
4)*p++和*(++p)的作用不同,若p的初值为a,则*p(++)等价a[0],*(++p)则等价a[1]。
5)(*p)++表示p所指向的元素值+1
6)如果p当前指向a数组中的第i个元素,则:
*(p--)相当于a[i--]
*(++p)相当于a[++i]
*(--p)相当于a[--i]
C---通过指针访问数组的更多相关文章
- YTU 2832: 使用指针访问数组元素--程序填空
2832: 使用指针访问数组元素--程序填空 时间限制: 1 Sec 内存限制: 128 MB 提交: 328 解决: 160 题目描述 输入10个整数值到数组中,使用指针来完成对这10个数组元素 ...
- c++ 指针访问数组
用指针访问一维数组 用指针访问二维数组 用指针访问三维数组 一. 用指针访问一维数组 //代码 ; ]={,}; int *p=&a; //int *p=&a[0]; printf(& ...
- 24深入理解C指针之---指针和数组
一.指针和数组 #include <stdio.h> int main(int argc, char **argv) { ] = {, , , , ,}; int *ptrVector = ...
- C语言的指针和数组
指针和内存 指针变量也是个变量,不过保存的是另一个变量的地址.另外编译器还会记住指针所指向变量的类型,从而在指针运算时根据变量类型采取不同操作. 例如,char * a 定义了char 类型的指针变量 ...
- C语言-再论指针与数组
指针与数组的天生姻缘1.以指针方式来访问数组元素(1).数组元素使用时不能整体访问,只能是单个访问.访问形式有两种:数组形式和指针形式.(2).数组形式访问数组元素:数组名[下标]:(下标从0开始(3 ...
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- 11-C语言指针&一维数组&字符串
一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
- 指针与数组的区别 —— 《C语言深度剖析》读书心得
原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...
- 指针 与 数组 以及 a 与 &a的区别
指针 与数组 并没有什么关系, 指针就是指针,指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到; 数组 ...
随机推荐
- EasyUI DataGrid和Pagination
连接一台EasyUI项目驱动学习 DataGrid数据表格及Pagination分页一起介绍 一.通过<table>标记创建DataGrid,嵌套<th>标签定义列表 < ...
- FastReport的再次使用
FastReport.Net是一款功能齐全的报表分析解决方案. 前两年工作的时候就是使用FastReport进行报表设计,只是当时使用的时候都是调用别人写好的帮助类,直接调用即可.当时让人觉得不明觉厉 ...
- C#内存分配学习
CLR内存分配分三大块区域:栈.GC堆.大对象堆. 一.线程堆栈(栈) 用于分配值类型实例.栈由操作系统进行管理,不受GC管理,当值类型不在其作用域(主要是指其所在函数内)时,其所占栈空间自动释放.栈 ...
- SDL2来源分析3:渲染(SDL_Renderer)
===================================================== SDL源代码分析系列文章上市: SDL2源码分析1:初始化(SDL_Init()) SDL2 ...
- python 性能- and-or 学习技能
C语言类似表情: bool ? a : b ,当表达式值为真的话,值为a.否则为b. 看一个样例: >>> a = "first" >>> b ...
- Java得到年在一个季度的错误的第一天
1.错误叙述性说明 Exception in thread "main" java.lang.IllegalArgumentException: Cannot format giv ...
- WPF学习(6)路由事件
做过.net开发的朋友对于事件应该都不陌生.追溯历史,事件(Event)首先应用在Com和VB上,它是对在MFC中使用的烦琐的消息机制的一个封装,然后.net又继承了这种事件驱动机制,这种事件也叫.n ...
- 【剑指offer】最小的k的数量
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26966159 题目描写叙述: 输入n个整数,找出当中最小的K个数.比如输入4,5,1,6, ...
- android可扩展自己的定义,运动图像裁剪框
在实际项目中,常常要制作一个简易的图像裁剪功能,即获取一张图片.并用一个遮罩层选择目标范围并截取保存的功能.例如以下图所看到的: 在此分享下该自己定义视图的制作过程. 需求说明 整一个视图包括一个透明 ...
- 四、Linux/UNIX操作命令积累【chmod、chown、tail】
正在使用Linux/UNIX下一个.经常使用文本界面来设置系统或操作系统,笔者也是在指挥这方面工作的过程中不断的接触.因此,为了此特酝酿.准备.開始了本文的编写.本文主要记录自己平时遇到的一些Linu ...