一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中)。所谓数组的指针是指数组的起始地址,数组元素的指针数组元素的地址。

这种指针变量的定义与以前介绍的指向变量的指针变量相同。应当注意,如果数组为int型,则指针变量亦应指向int型。

C语言规定数组名代表数组的首地址,也就是第一个元素的地址。因此,下面两个语句等价:

p=&a[0];

p=a;

注意数组a不代表整个数组,上述"p=a;"的作用是"把a数组的首地址赋给指针变量p",而不是"把数组a各元素的值赋给p"。

在定义指针变量时可以赋给初值:

int*p=&a[0];

它等效于:

int*p;

p=&a[0];

当然定义时也可以写成

int*p=a;

它的作用是将a的首地址(即a[0]的地址)赋给指针变量p(而不是*p)。

假设p已定义为指针变量,并已给它赋了一个地址,使它指向某一个数组元素。

如果有以下赋值语句: *p=1; 表示对P当前所指向的数组元素赋以一个值(值为1)。

C规定对p+1指向数组的下一个元素(而不是将p值简单地加1)。

如果p的这初值为&a[0],则: (1)p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素。 (2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。 (3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。

根据以上叙述,引用一个数组元素,可以用: (1)下标法,如a[i]形式; (2)指针法,如*(a+i)或*(p+i)。

要输出各元素的值有三种方法: ○1下标法 ○2通过数组名计算数组元素地址,找出元素的值。 ○3用指针变量指向数组元素。

对三种方法的比较: (1)第1、2种方法执行效率是相同的。 (2)第3种方法比1、2法快,用指针变量直接指向元素,不必每次都重新计算地址,像 p++这样的自加操作是比较快的。 (3)用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。

在使用指针变量时,有几个问题要注意: 1、指针变量可以实现使本身的值改变。 2、要注意指针变量的当前值。 3、虽然定义数组包含10个元素,用p指向数组元素,但批针变量可以指到数组以后的内存单元。 4、注意指针变量的运算。

因此,用数组名作实参,在调用函数时实际上是把数据的首地址传给形参(注意,不是把数组的值传给形参)。

请注意,在调用函数后,实参数组的元素值可能会发生改变,这种值的变化实际上并不是从形参传回实参的,而是由于形参与实参数组共享同一段内存而造成的。

如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种情况: 1、形参和实参都用数组名。 2、实参用数组名,形参用指针变量。 3、实参形参都有指针变量。 4、实参为指针变量,形参为数组名。

 
 

C语言学习笔记 (004) - 数组名和数组首地址(转)的更多相关文章

  1. C语言 数组名不是首地址指针

    今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...

  2. C语言学习笔记(一):数组传递时退化为指针

    这几天闲来无事,写了一个数组元素排序函数如下: #include <stdio.h> #include <stdlib.h> void ArraySort(int array[ ...

  3. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  4. C语言学习笔记--数组指针和指针数组

    C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...

  5. C语言学习笔记--多维数组和多维指针

    1. 指向指针的指针 (1)指针的本质是变量,会占用一定的内存空间 (2)可以定义指针的指针来保存指针变量的地址值 (3)指针是个变量,同样也存在传值调用与传址调用 重置动态空间的大小 #includ ...

  6. C语言学习笔记--指针和数组的关系

    1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...

  7. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

  8. C语言学习笔记---谭浩强

    前段时间有机会去面试了一次,真是备受“打击”(其实是启发),总的来说就是让我意识到了学习工具和学习技术的区别.所以最近在看一些数据结构和算法,操作系统,python中的并行编程与异步编程等东西.然而数 ...

  9. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

随机推荐

  1. POJ 1265 pick定理

    pick公式:多边形的面积=多边形边上的格点数目/2+多边形内部的格点数目-1. 多边形边上的格点数目可以枚举每条边求出.如果是水平或者垂直,显然可以得到,否则则是坐标差的最大公约数减1.(注这里是不 ...

  2. Mybatis拦截器实现SQL性能监控

    Mybatis拦截器只能拦截四类对象,分别为:Executor.ParameterHandler.StatementHandler.ResultSetHandler,而SQL数据库的操作都是从Exec ...

  3. java.io.ioexception failed to mkdirs jenkins xcode || jenkins 无法创建新文件

    =========================================================== FATAL: Failed to mkdirs: /Users/chenqing ...

  4. ios Url Encode

    //ios Url Encode //有时候在请求的参数里里特殊符号比如“+”等.而如果没有encode的话那么传过去的还是” ”,面实际上是%2B. -(NSString*)UrlValueEnco ...

  5. ZH奶酪:如何在Ubuntu上安装Java/管理多个JAVA/设置JAVA_HOME

    0.简介 Java的地位及重要性,大家都懂的,很多软件都依赖于jdk,在Ubuntu上安装Java的选择有很多,openJDK,Oracle Jdk... 1.安装默认 JRE/JDK(可选) 这是最 ...

  6. 用Android程序打开和关闭输入法

    一.打开输入法窗体: InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPU ...

  7. snabbdom vdom 框架

    1.snabbdom github地址:https://github.com/snabbdom/snabbdom 2.核心方法 var vnode = h('div#container.two.cla ...

  8. cocos2d-js 3.0 rc2 自定义UI控件组件 例子:能播放动画的MenuItem。MenuItemSprite的bug

    其实总体自定义UI组件都比较简单,尤其是cocos2d-js是开源的,如果有什么不明白的直接看js代码或者C++代码即可.当然js代码基本就够了. 另外,js的ctor函数虽然说是构造函数,但毕竟不是 ...

  9. Xamarin.Android其他类型的服务

    一.前言 前面我们已经学了关于服务的很多知识,但是对于真实的开发那些远远不够,通过这节我们将学习其他类型的服务,比如前台服务.IntentService和消息服务.下面我们开始进入正题. 二.前台服务 ...

  10. 【树莓派+.NET MF打造视频监控智能车】遥控篇

    树莓派是最近比较火热的开源硬件,其设备只有信用卡大小,运行着Linux系统,专为学生编程教育而设计.我十多年的技术路线基本以学习微软的技术为主,中间也曾试图学习过linux,但是相对陡峭的学习曲线,只 ...