数组的本质

数组的概念

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

数组的大小

  • 数组在一片连续的内存空间中存储元素
  • 数组元素的个数可以显示或隐式指定

例子1:数组的初始化

#include<stdio.h>
int main()
{
    int a[5] = {1,2};
    int b[] = {1,2};

    printf("a[2] = %d\n",a[2]);
    printf("a[3] = %d\n",a[3]);

    printf("sizeof(a) = %d\n",sizeof(a));
    printf("sizeof(b) = %d\n",sizeof(b));

    return 0;
}

数组地址与数组名

  • 数组名代表数组首元素的地址
  • 数组的地址需要用取地址符&才能得到
  • 数组首元素的地址值与数组的地址值相同
  • 数组首元素的地址与数组的地址是两个不同的概念

数组名的盲点

  • 数组名可以看做一个常量指针
  • 数组名“指向”的是内存中数组首元素的起始位置
  • 数组名不包含数组的长度信息
  • 在表达式中数组名只能作为右值使用
  • 只有在下列场合中数组名不能看做常量指针
    • 数组名作为sizeof操作符的参数
    • 数组名作为&运算符的参数

例子2:数组和指针的不同

#include<stdio.h>

int main()
{
    int a[5] = {0};
    int b[2];
    int* p = NULL;

    p = a;

    printf("a = %p\n",a);
    printf("p = %p\n",p);
    printf("b = %p\n",b);

    return 0;
}

小结

  • 数组是一片连续的内存空间
  • 数组的地址和数组首元素的地址意义不同
  • 数组名在大多数情况下被当成常量指针处理
  • 数组名其实并不是指针,不能将其等同于指针

原文地址:https://www.cnblogs.com/yanyun888/p/9213161.html

时间: 2024-08-30 16:05:01

数组的本质的相关文章

a和&amp;a的区别、二维数组的本质及多维数组

1 a和&a的区别 int a[10] = {1,2};//其他初始化为0 a代表数组首元素的地址,不是整个数组的地址 &a表示整个数组的地址 &a,a代表的数据类型不一样 &a数组类型int[10] a 数组首元素的类型 2 数组指针的用法 int i=0;//循环变量 int a [5] = {3, 4, 5, 6, 2}; //直接定义一个数组指针 int (*p)[5] = &a; for (i=0; i<5; i++) { printf("

第27课 数组的本质分析

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[

数组的本质分析

数组是相同类型的变量的有序集合 数组在一片连续的内存空间中存储元素 数组元素的个数可以显示或隐式指定 int a[5] = {1,2}; int b[] = {1,2}; 数组名代表数组首元素的地址 数组的地址需要取地址符&才能得到 数组首元素的地址与数组的地址值相同 数组首元素的地址与数组的地址是两个不同的概念 数组名可以看作一个常量指针 数组名"指向"的是内存中数组首元素的起始位置 数组名不包含数组的长度信息 在表达式中数组名只能作为右值使用 只有在下列场合中数组名不能看做

数组与指针的本质

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,

string:本质是char类型的数组

一个字符串,可以看作是多个char组成的数组,本质就是char类型数组. 字符串是 Unicode 字符的有序集合,用于表示文本.所以String 对象是 Char 对象的有序集合,用于表示字符串.String 对象的值是该有序集合的内容,并且该值是不可变的.字符串本质是字符数组--这是一个非常重要的概念,了解这个概念就可以全面的理解和把握字符串的各种特征. 由于字符串是字符数组,因此字符串可以直接当数组使用,通过下标的模式访问字符串中的每一个字符,或者可以将字符串转为字符数组. static

娓娓道来c指针 (5)c数组本质

(5)c数组本质 c中的数组是一种聚合类型,把同种类型的元素按顺序存储,即是数组.c中数组类型的特点在于:它是嵌套定义的. 看下一个二维数组int array[2][3]={{1,2,3},{4,5,6}};的内存存储形式: c中的数组是嵌套定义的:二维数组的元素是一维数组,三维数组的元素是二维数组-- 像array[2][3]这样的二维数组,是由两个一维数组组成的:array[0].array[1],这两个一维数组的规模都是array的第二个下标3.同时,array[0].array[1]就是

CF 313 DIV2 B 树状数组

http://codeforces.com/contest/313/problem/B 题目大意 给一个区间,问你这个区间里面有几个连续相同的字符. 思路: 表示个人用树状数组来写的...了解了树状数组的本质就行了. 当然用sum[r]-sum[l]也是可以的

数组指针与二维数组的寻址

引例:已知如下程序 1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 } 试写出程序的输出值.(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出

数组与数组列表

数组 数组代表一系列对象或者基本数据类型,所有相同的类型都封装到一起——采用一个统一的标识符名称.简单来讲,数组就是一组相关数据的集合,是一连串的变量.Java中数组的定义和使用时通过方括号索引运算符进行的({}),一般来说,有两种定义数组的方法,只需在类型名或标识符后跟一对方括号即可. int[] a1; int a1[]; 两种表示方法是完全一样的.此时只是声明了指向数组的一个对象,并未对其分配任何空间,为了创建数组相应的存储空间,就必须要写一个初始化表达式.如: int b = {1, 2