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,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到; 数组 ...
随机推荐
- Socket编程实践(4) --更复杂的过程server
1.Socket地址复用 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); in ...
- qml动画控制器AnimationController
AnimationController: 一般的动画是使用定时器来完毕的,可是AnimationController同意给定的动画,手动控制,能够通过控制她的progress属性来操作动画的进度. c ...
- 小牟Andorid下面MD5具体实现的思路总结
Android的开发往往需要一定数目demo 从今起MD5一些加密算法提取物 看看是如何实现的 首先,我们必须明确为什么加密? 1 数据安全处理 2 防止数据窃取 3 有效的避免恶意攻击 4 保证文件 ...
- CGI原理解析系列之中的一个----CGI怎样获取WEBserver数据
//gcc get_post.c -o get_post.ums; #include <stdio.h> #include <stdlib.h> #include <un ...
- 三思考,实现自己定义404页:Tomcat、SpringMVC精确匹配、重写DispatchServlet
第1种方式:Tomcat直接处理 web.xml <error-page> <error-code>404</error-code> <location> ...
- 使用C/C++编译预处理时须要注意的问题
1.宏定义不是C/C++语句,不须要使用语句结束符":",否则它也被看做宏体的一部分. 2.不要在引用宏定义的參数列表中使用增量和减量运算符,否则将导致变量的多次求值.比如: #d ...
- 深入浅出java并发
http://www.blogjava.net/xylz/archive/2010/07/08/325587.html
- 使用php+swoole对client数据实时更新(二) (转)
上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终 ...
- angular cors跨域资源共享设置 和formdata设定
非常easy,下来容易找到: <pre name="code" class="javascript">.config(['$routeProvide ...
- 64位sql server 如何使用链接服务器连接Access
原文:64位sql server 如何使用链接服务器连接Access 测试环境 操作系统版本:Windows Server 2008 r2 64位 数据库版本:Sql Server 2005 64位 ...