C语言学习笔记--数组

1.数组的概念

(1)数组是相同类型的变量的有序集合

(2)数组在一片连续的内存空间中存储元素

(3)数组元素的个数可以显示或隐式指定

#include <stdio.h>
int main()
{
    //数组初始化
    int a[5] = {1, 2};//第 1、2 个元素分别为 1、2,其余为 0
    int b[] = {1, 2};//编译过程中,编译会为计算数组 b 的大小
    int i=0;
    for (i = 0;i < 4;i++)
    {
        printf("a[%d] = %d\n",i,a[i]);
    }
    printf("sizeof(a) = %d\n",sizeof(a)); //20
    printf("sizeof(b) = %d\n",sizeof(b)); //8
    printf("count for a: %d\n",sizeof(a)/sizeof(int)); //5
    printf("count for b: %d\n",sizeof(b)/sizeof(int)); //2
    return 0;
}

2.数组地址(&a)与数组名 a

(1)数组名 a 代表数组首元素的地址。因此,第 2 个元素的地址为 a+1,以此类推……。注 意 a 或 a+i 表示元素的地址。可以用*(a+i)取出元素的值,也可以用 a[i]来取出元素的

值,因为当编译中遇到 a[i]会自动转为*(a+i)。反过来也可知,第 1 个元素的地址为 a 或&a[0],第 2 个元素的地址为 a+1 或&a[1],第 i 个元素的地址为(a+i)或&a[i]……

(2)数组的地址需要用取地址符&才能得到。即形如&a 取的是整个数组的地址,所以&a+1表示指向整个数组的最后面的位置。

(3)数组的首元素的地址值与数组的地址值相同,但是两个不同的概念。

数组名和数组地址

#include <stdio.h>
int main(){
    //将数组每个元素初始化为 0
    int a[5] = {0};//含义,将第 1 个元素初始化为 0,其余为 0.
    printf("a = %p\n",a); //首元素的地址
    printf("&a = %p\n",&a); //整个数组的地址,从数值上看,与 a 一样。
    printf("&a[0] = %p\n",&a[0]);//第 1 个元素的地址
    return 0;
}

3.数组名的盲点

(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组。如 int a[5]表示 a 的类型为 int[5],所以 sizeof(a)表示取整个数组的大小,&a 表示数组的地址。

(2)数组名的外延:除了sizeof(a)和&a外,数组名经常可看作是一个常量指针。但要注意这里仅仅是“看作”,而不是真正的指针。不同于指针,数组名只是编译过程中的一个符号,编译器并不为其分配内存,有人称之为伪变量。因此,形式a++\a—或a=b(其中b是另一个数组名)这些都是错误的,因为a只是一个符号,编译器会把数组信息(如大小,地址)放入符号表中,每次遇到数组名a时,就会从符号表中取出这个数组的地址,然后用这个固定的地址代替 a,所以这个符号并没有被分配内存空间,而上述操作都是针对变量而言的,故数组名只能做为右值使用。

(3)对数组的引用,如a[i]或*(a+i),只需访问内存一次,而指针的引用如*(p+i)则需要两次,首选通过&p找到p指针,然后加i,再从p+i里面取出的内容。

(4)当数组名作为形参时,将退化为指针。即可以把数组名当成指针来用,这里的sizeof(数组名)为4,即指针的长度。

数组和指针并不相同

#include <stdio.h>
int main()
{
    //将数组每个元素初始化为 0
    int a[5] = {0};
    int b[2];
    int* p = NULL;
    p = a;
    printf("a = %p\n",a); //首元素的地址
    printf("p = %p\n",p); //p==a。
    printf("&p = %p\n",&p);//指针 p 的地址
    printf("sizeof(a) = %d\n",sizeof(a));//数组的大小:20
    printf("sizeof(p) = %d\n",sizeof(p));//指针的大小为 4.
    printf("\n");
    p = b;
    printf("b = %p\n",b); //首元素的地址
    printf("p = %p\n",p); //p==b。
    printf("&p = %p\n",&p);//指针 p 的地址
    printf("sizeof(b) = %d\n",sizeof(b));//数组的大小:8
    printf("sizeof(p) = %d\n",sizeof(p));//指针的大小为 4.
    //a = b; //编译错误,数组名不能作为左值;
    //a++; //编译错误,数组名被编译一个固定地址,相当0xaabbccdd++的错误
    return 0;
}

数组名其实并不是指针,不能将其等同于指针。

时间: 2024-10-12 08:06:12

C语言学习笔记--数组的相关文章

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

1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. (2)参数位于栈上,太大的数组拷贝将导致栈溢出. (3)将数组名看做常量指针,传递的是数组的首元素地址,而不是整个数组. 2. 二维数组参数 (1)二维数组参数同样存在退化的问题: 二维数组可以看做是一维数组,其中的每个元素又是一个一维数组 (2)二维数维参数中第一维的参数可以省略 ①void f(

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

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

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

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

Perl语言学习笔记 6 哈希

1.哈希的键是唯一的,值可以重复! 2.访问哈希元素 $hashname{"$key"};#哈希为大括号,数组为方括号,键为字符串 $family_name{"fred"} = "firstd";#给哈希元素赋值 3.哈希键支持任意表达式 $foo = "na"; $family_name{$foo."me"};#获取$family_name{"name"}对应的值 4.访问整个哈希 %

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

Perl语言学习笔记 15 智能匹配与give-when结构

1.智能匹配操作符 替代绑定操作符: 在哈希中查找某一个键: 比较两个数组是否完全相同: 查找列表中是否存在某个元素: 智能匹配操作符与顺序无关,~~ 左右元素可以互换 2.智能操作符优先级 3.given语句 相当于c语言的switch语句 4.given可以测试多个条件,在default前用break,否则会导致default一直执行 5.笨拙匹配(正则表达式方式) 6.多个项目的when匹配 可以在语句中间加上其他语句: Perl语言学习笔记 15 智能匹配与give-when结构,布布扣

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.字符串: 最短的字符串为空字符

JS学习笔记-数组

ECMAScript中没有提供类和接口等的定义,但它却是一门面向对象的语言,由于它能够通过其它 方式实现类似高级语言的面向对象功能,这些内容将在后面的文章中进行一步步的总结.此篇仅对JS中对象作简要说明,重点汇总一些类似于对象的数组的经常用法. 对象 创建 上篇提到创建对象的两种方式: 使用new运算符创建Object var obj = new Object(); 使用字面量方式创建 var   obj = {}; 这里值得注意的是在使用字面量(常量)创建Object时不会调用构造函数. 属性