C语言——数组、sizeof关键字
一、数组
1.数组的引入与定义:
C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。数组中的每个元素可以通过索引来访问,索引通常是一个整数,用于指定元素在数组中的位置。在C语言中,数组索引是从0开始的。
要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中有多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数组处理。例如,下面是对数组的定义:
type arrayName[arraySize];
type
指定数组中元素的类型(如int
、float
、char
等)。arrayName
是数组的名称。arraySize
是数组中元素的数量,它必须是一个常量表达式,并且指定了数组的大小。
2.数组的初始化:
(1)全部赋值
在定义数组时对全部数组元素赋予初值。例如:
int a[10] = {0,1,2,3,4.5,6,7.8,9};
将数组中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。花括号内的数据就称为“初始化列表”。经过上面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。
(2)部分赋值
可以只给数组中的一部分元素赋值。例如:
int a[10]={0,1,2,3,4};
定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元赋初值,系统自动给后5个元素赋初值为0。
(3)初始化为0
如果想使一个数组中全部元素值为0,可以写成
int a[10]={0,0,0,0,0,0,0,0,0,0};
或
int a[10] = {0}; //未赋值的部分元素自动设为0
(4)不定义数据长度
在C语言中,可以在声明数组的同时初始化它,例如:
int numbers[] = {1, 2, 3, 4, 5};
char letters[] = {'a', 'b', 'c', 'd', 'e'};
注意,如果在声明时初始化数组但未指定大小,编译器会自动根据初始化列表中元素的数量来确定数组的大小。
3.访问数组元素:
通过指定数组的索引(位置)来访问数组中的元素,例如:
int secondNumber = numbers[1]; // 访问 numbers 数组中的第二个元素(索引为1)
char firstLetter = letters[0]; // 访问 letters 数组中的第一个元素(索引为0)
4.数组的遍历:
遍历数组即访问数组中的每个元素。这通常通过循环实现,例如使用 for
循环:
for(int i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}
这段代码会打印出 numbers
数组中的所有元素。
5.简单示例:
#include<stdio.h>
int main()
{
int data = 1;
int array[]={0,0,0,0,0};
int arraySize;
for(int i = 0;i < 5;i++){
array[i] = data + 10;
data++;
printf("array[%d]address=%p,array[%d]=%d\n",i,&array[i],i,array[i]);
}
arraySize = sizeof(array)/sizeof(array[0]);
printf("数组array的长度为:%d",arraySize);
return 0;
}
输出将是:
array[0]address=000000000061FE00,array[0]=11
array[1]address=000000000061FE04,array[1]=12
array[2]address=000000000061FE08,array[2]=13
array[3]address=000000000061FE0C,array[3]=14
array[4]address=000000000061FE10,array[4]=15
数组array的长度为:5
由此我们可以看出,数组中存放的数据的地址是连续的。
6.注意事项:
- 数组的大小在声明时确定,并且之后不能改变。
- 访问数组元素时,索引必须在有效范围内(即 0 到
arraySize - 1
)。如果尝试访问超出这个范围的元素,将会导致未定义行为,通常是程序崩溃。 - 在C语言中,数组名通常代表数组首元素的地址。因此,在某些上下文中,数组名可以被用作指向其第一个元素的指针。
数组是C语言中非常基本且强大的数据结构,它们允许我们 以紧凑和高效的方式处理一系列相同类型的数据。
二、sizeof关键字
sizeof
是 C 语言(以及 C++、C# 等多种编程语言)中的一个操作符,用于在编译时计算对象或类型所占的内存空间大小(以字节为单位)。它返回的是一个无符号整数(size_t
类型),表示了请求的对象或类型在内存中占用的字节数。
1.使用方式:
sizeof
可以用于计算变量、类型、数组、结构体(包括联合体)、指针等的大小。其使用方式主要有两种:
-
计算变量或数组的大小:
sizeof(variable_name)
或sizeof array_name
。注意,对于数组,不论是否指定了数组索引,sizeof
返回的都是整个数组的大小。 -
计算类型的大小:
sizeof(type)
,其中type
可以是基本数据类型(如int
、float
、char
等),也可以是用户定义的类型(如结构体、联合体等)。
2.示例:
#include <stdio.h>
int main() {
int a = 5;
char b = 'A';
double c = 3.14;
printf("Size of int: %zu bytes\n", sizeof(a));
printf("Size of char: %zu bytes\n", sizeof(b));
printf("Size of double: %zu bytes\n", sizeof(c));
// 数组示例
int arr[10];
printf("Size of arr: %zu bytes\n", sizeof(arr)); // 整个数组的大小
printf("Size of arr[0]: %zu bytes\n", sizeof(arr[0])); // 数组中单个元素的大小
// 结构体示例
struct MyStruct {
int x;
char y;
double z;
};
printf("Size of struct MyStruct: %zu bytes\n", sizeof(struct MyStruct));
return 0;
}
输出将是:
Size of int: 4 bytes
Size of char: 1 bytes
Size of double: 8 bytes
Size of arr: 40 bytes
Size of arr[0]: 4 bytes
Size of struct MyStruct: 16 bytes
3.注意事项
sizeof
是在编译时计算的,因此其结果是一个常量表达式。- 对于指针,
sizeof
返回的是指针本身的大小,而不是指针所指向的内存区域的大小。在不同的系统和编译器中,指针的大小可能不同(通常是 4 字节或 8 字节)。 - 结构体(和联合体)的大小可能会受到内存对齐(padding)的影响,导致实际占用的内存大小大于其成员大小的总和。
- 数组名在表达式中会被转换为指向数组首元素的指针,但只有在
sizeof
操作符中,数组名才表示整个数组的大小。
原文地址:https://blog.csdn.net/weixin_45720999/article/details/140395391
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!