C语言学习笔记 (004) - 数组名和数组首地址(转)

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

这种指针变量的定义与以前介绍的指向变量的指针变量相同。应当注意,如果数组为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、实参为指针变量,形参为数组名。

时间: 2024-08-06 16:41:58

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

C语言学习笔记(五) 数组

数组 数组的出现就是为了解决大量同类型数据的存储和使用的问题: 数组的分类:一维数组.二维数组. 一维数组:为多个变量连续分配存储控件:所有的变量的数据类型必须相同:所有变量所占的字节大小必须相等: 例如:int a[4]; 一维数组名不代表数组中的所有元素而是代表数组中第一个元素的地址: 数组的初始化: 完全初始化: int a[4] = {1,2,3,4}; 不完全初始化: int a[4] = {1};  未被初始化的元素的值默认为0; 数组清零 int a[4] = {0}; 不初始化:

C语言学习笔记(六) 指针和数组

使用C语言就必然会使用到指针和数组.看下面的代码: int main(int argc, char** argv){     int a[4] = {1,3,5,7};     int *p = a;     int i;     for (i=0; i<4;i++){         printf("i=%d, p[i]=%d, *(p+i)=%d, a[i]=%d, *(a+i)=%d\n",                 i, p[i], *(p+i), a[i], *(

C语言学习笔记:19_数组-字符数组与字符串(常用字符串函数)

/* * 19_数组-字符数组与字符串.c * * Created on: 2015年7月7日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> #include <string.h> /** *一:字符数组:就是存放字符的char[]数组 * 由于c语言中没有像java,C#中的String(字符串),只有存放字符 的字符型数组当字符串使用(java中的String类也是对字符数组进行封闭的). * *

C语言学习笔记-6.数组

一.一维数组的定义和使用 1.C语言中,数组元素的下标是从0开始 2.定义数组时,需要设定它的长度,该长度必须是一个整型常量 注:常量采用宏定义优势:用简短标识符代替长数据 有利于程序修改和升级 用易于理解的标识符代替不好记的数据 格式:#define PI 3.14 (没有分号) 3.如果对全部的数组元素赋予初值,则可以不指定数组的长度 在初始化时,如果初值的个数少于元素个数,则剩余的自动补0 二.字符数组与字符串 1.字符串通常都保存在字符数组中,每个元素存放一个字符,以'\0'结尾 2.字

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

1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译器自动分配一片连续的内存空间 ,而指针声明时只分配了用于容纳地址值的 4 字节空间 2.指针的运算 (1)指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时,p+1 指向当前元素的

15-黑马程序员------C 语言学习笔记---数组和指针

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 四 数组和指针 01 数组名代表数组在内存中的首地址,表示的是地址信息,因此数组名可以理解为一个指针,不过数组名是一个常量,不能改变. #include <stdio.h> int main() { char nam

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data

Perl语言学习笔记 day 1

1.Perl Practical Extraction and Report Language:实用摘录与报表语言 2.多行注释 (1) =需要顶格写 = description statement; =cut (2)末尾的description需要顶格写 <<description; print "Hello,world!\n"; description 3.数字: 所有数字在Perl内都以双精度浮点数格式存储; 5**3:5*5*5: 4.字符串: 最短的字符串为空字符

《Javascript权威指南》学习笔记之十二:数组、多维数组和符合数组(哈希映射)

Array(数组)是JavaScript中较为复杂的数据类型,同Java.C#.VB等程序语言的数组相比,Javascript数组中的元素不必为相同的数据类型,可以在数组每个元素上混合使用数字.日期.字符串.Object,甚至添加一个嵌套数组. 一.创建数组 1.var arr1 = new Array(); /var  arr2 = new Array(length); /var arr3 = new Array(element1,element2...); var arr4 = [eleme