深入浅出C指针(二)一维数组

原创 2012年03月22日 11:15:39
1.数组名
我们看一下下面两个声明:
int a;
int b[10];
我们把变量a称为标量,因为它是个单一的值。我们把变量b称为数组,因为它是一些值的集合。b[0]表示数组中的第一个数,b[1]表示数组中的第二个数,以此类推。
我们知道b[0]的类型是整形,那么,b的类型是什么呢?它所表示的是什么呢?一个合乎逻辑的答案似乎是它表示整个数组,但事实并非如此。在C语言中,数组名永远代表一个指针常量,也就是数组第一个元素的地址,即 &b[0]。它的类型取决于数组的类型。
注意,这里说的是“指针常量”,而不是上一篇文章说的“指针变量”。指针常量即不能改变指针所指向的值。即这样的代码是错误的:
int number = 0;
int a[10] = {0};
a = &number;
a虽然是一个整形指针,但是他是一个指针常量,不能将其值改变。
请不要根据数组名是指针这个事实得出指针和数组是相同的结论。数组具有一些和指针完全不同的特性。例如,数组具有确定的数量值,而指针只是一个标量值。
2.下标引用
在前面的声明的上下文环境中,下面这个表达式是什么意思呢?
*(b + 3);
首先,b的值是一个指向整形的指针常量。所以3这个值根据整形值得长度进行调整。加法运算的结果是另一个指向整形的指针,即 &b[3]。再通过*号对其解引用操作,相当于
*(&b[3])或者直接表示为b[3].
我们姑且可以这样认为:除了优先级顺序不同外,下标引用和指针间接访问完全相同。例如,下面这两个表达式是等同的:
array[subsricpt]
*(array + (subsript) )
让我们看一个例子,巩固复习一下刚才的知识
int array[10];
int *ap = array + 2;
在下面有关ap的表达式中,看看你能不能写出对应的array表达式:
ap ,这个很容易,&array[2]或者*(array + 2)
*ap ,这个也很容易,相当于对ap进行解引用操作,相当于array[2]或者*(array+2)
ap[0],将其转化成为*(ap + 0),即*ap,和上一个表达式等价。
ap+6,这个表达式相当于&array[2+6]或者*(array+2+6),即&array[8]或者
*(array+8)
*ap+6,小心,这里有两个操作符,不过间接访问的优先级高于加法操作,所以该式等价于array[2]+6
ap[6],你也许会疑问?这是错的吗?的确,在别的语言里他也许是错的,但是在C语言里他是正确的,我们说过,C语言中的下表操作与指针间接访问操作完全相同,即
*(ap+6)
&ap,这个表达式是完全合法的,它表示ap指针的地址,即指针的指针。
好了如果上面的问题都难不倒你的话,拿来看看下面这个:
2[ap]
是的,你没有看错,2[ap],不是ap[2].
他的答案也许会令你大吃一惊:它是合法的。把它转化成为对等的间接访问表达式,你就会发现它的有效性:
*(2 + (array))
内层的括号是多余的,即他和*(array + 2)是等价的。
3.关于指针和数组的效率
在此笔者不想通过反汇编来实验数组与指针的效率,读者暂时可以这样记住:
“假定这两种方法都是正确的,下标绝不会比指针更有效率,但是指针有时会比下标更有效率”

C语言--指针和一维数组

#include //指针运算 int main(int argc, const char *argv[]) { short a = 10; short *p = &a; printf("&...
  • u011266694
  • u011266694
  • 2016年10月29日 14:47
  • 186

一维指针和二维指针指向二维数组的一些问题

废话少说,先上自己Dev c++上的代码: #includeint main (){ int c[2][3]={15,2,3,4,5,6}, *p, (*rp)[3],*q,i; ...
  • qq_33268231
  • qq_33268231
  • 2016年01月26日 01:16
  • 1540

【C语言】12-指向一维数组元素的指针

本文目录 一、用指针指向一维数组的元素二、用指针遍历数组元素三、指针与数组的总结四、数组、指针与函数参数 前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向...
  • luohai859
  • luohai859
  • 2014年04月30日 16:40
  • 8933

关于c语言二维数组与指针的个人理解及处理办法。

此文章简要介绍了二维数组和指针以及函数的处理方法。
  • love1code
  • love1code
  • 2015年02月12日 21:58
  • 1678

数组、二级指针

摘自《C语言深度剖析》1、#include int main(int argc,char * argv[]) { int a [3][2]={(0,1),(2,3),(4,5)}; ...
  • ZHONGJAMIN
  • ZHONGJAMIN
  • 2016年04月23日 22:58
  • 244

C语言中动态分配数组指针的释放问题

http://hi.baidu.com/piaoliuxing126/item/bbf8a324fa4d5153c28d5904 我们都知道要实现根据程序的需要动态分配存储空间,在C中需要使用到st...
  • bytxl
  • bytxl
  • 2013年08月23日 10:35
  • 1530

C语言——数组指针和通过指针引用数组元素的方法总结

1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢?int (* p)[10]; /*括号是必须写的,不然就是指针数组;10是数组的大小*/拓展:有指针类型元素的数组称为指针数组。 2...
  • jingzi123456789
  • jingzi123456789
  • 2016年05月11日 19:25
  • 4402

浅谈数组和指针

这应该不是议数据和指针,应该是阅读笔记吧!但是其这个题目更好点。       C专家编程第四章内容:令人震惊的事实:数组和指针并不相同。自己也收获不小,了解很多基础的东西,对那些初入C开发人员有很好的...
  • jsh13417
  • jsh13417
  • 2013年02月20日 21:37
  • 2341

C语言04 -- 一维数组,字符串

// // main.m // C4–一维数组 // // Created by dllo on 15/7/3. // Copyright (c) 2015年 Gaozi. All ...
  • gao_zi
  • gao_zi
  • 2015年07月20日 19:36
  • 1165

C语言一维数组的定义和引用

一维数组的定义方式   在C语言中使用数组必须先进行定义。一维数组的定义方式为:   类型说明符 数组名 [常量表达式];   其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定...
  • kw979wk
  • kw979wk
  • 2016年11月03日 22:33
  • 2079
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入浅出C指针(二)一维数组
举报原因:
原因补充:

(最多只允许输入30个字)