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,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到; 数组 ...
随机推荐
- 最小二乘法拟合java实现源程序(转)
因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...
- HDOJ 5000 Clone
所有的属性,以满足一定的条件,是,财产和等于sum/2结果最大. Clone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- C++中的class (2)
class Father { protected void methodA(){ //do something } private void methodB(){//do something } } ...
- CodeForces 396C 树状数组 + DFS
本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节 ...
- Iterator、Iterable接口的使用及详解
Java集合类库将集合的接口与实现分离.同样的接口,可以有不同的实现. Java集合类的基本接口是Collection接口.而Collection接口必须实现Iterator接口. 以下图表示集合框架 ...
- 如何成为游戏的生产者——第二章:如何开始你的编程(开发环境的搭建、C++语言适应)
如何成为游戏的生产者--文章二章:怎样開始你的编程 小故事:上节说到我六年级打开了那本C语言的书,然后其实我还是没看懂.好像看懂了一些printf语句.之后遇到了史无前例的困难--怎么让代码执行起来. ...
- mahout源码KMeansDriver分析之五CIMapper初探
接着上篇,继续分析代码.下面就到了MR的循环了,这里MR应该算是比较好理解的,重点是退出循环的条件设置,即如何判断前后两次中心点误差小于给定阈值. 首先,while循环: while (iterati ...
- Mac下Jekyll安装
之前一直用Wordpress,虽然功能强大,各种插件各种bug,如果想弄个主题,折腾得要命.最近改用jekyll+gitHub免费空间.记录一下. 我用的是Mac,所以只讲述Mac下如何安装,Wind ...
- NSIS:使用nsWindows.nsh头文件调整窗体大小
原文 NSIS:使用nsWindows.nsh头文件调整窗体大小 此方法只能简单实现调整窗体大小,但不完美,调整后窗体上其他的控件都需要调整大小或位置,比较麻烦,轻狂不建议使用呵! ;加头文件!inc ...
- Vim 命令 【转】
高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx 开始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的宏命 ...