zoukankan      html  css  js  c++  java
  • 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
    ",i,a[i]);
        }
        printf("sizeof(a) = %d
    ",sizeof(a)); //20
        printf("sizeof(b) = %d
    ",sizeof(b)); //8
        printf("count for a: %d
    ",sizeof(a)/sizeof(int)); //5
        printf("count for b: %d
    ",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 ",a); //首元素的地址 printf("&a = %p ",&a); //整个数组的地址,从数值上看,与 a 一样。 printf("&a[0] = %p ",&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
    ",a); //首元素的地址
        printf("p = %p
    ",p); //p==a。
        printf("&p = %p
    ",&p);//指针 p 的地址
        printf("sizeof(a) = %d
    ",sizeof(a));//数组的大小:20
        printf("sizeof(p) = %d
    ",sizeof(p));//指针的大小为 4.
        printf("
    "); 
        p = b;
        printf("b = %p
    ",b); //首元素的地址
        printf("p = %p
    ",p); //p==b。
        printf("&p = %p
    ",&p);//指针 p 的地址
        printf("sizeof(b) = %d
    ",sizeof(b));//数组的大小:8
        printf("sizeof(p) = %d
    ",sizeof(p));//指针的大小为 4.
        //a = b; //编译错误,数组名不能作为左值;
        //a++; //编译错误,数组名被编译一个固定地址,相当0xaabbccdd++的错误
        return 0;
    }

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

    参考资料:
    www.dt4sw.com
    http://www.cnblogs.com/5iedu/category/804081.html

  • 相关阅读:
    Kali安装输入法
    各类16进制文件头
    KALI搭建DVWA
    [LeetCode]子串的最大出现次数(字符串)
    [LeetCode]415. 字符串相加、43. 字符串相乘
    [LeetCode]1249. 移除无效的括号(字符串,栈)
    [Leetcode]585. 2016年的投资(MySQL)
    [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)
    [LeetCode]1071. 字符串的最大公因子(gcd)
    [LeetCode]Sql系列4
  • 原文地址:https://www.cnblogs.com/CoderTian/p/5906264.html
Copyright © 2011-2022 走看看