一、指针的大小
在C语言中,指针的大小取决于系统和编译器的架构,而不是它所指向的数据类型。
1. 指针大小的特点
- 与系统架构相关:
-
- 32位系统:指针通常为4字节
- 64位系统:指针通常为8字节
- 与指向的数据类型无关:
-
char*,int*,double*等不同类型的指针大小相同
2. 获取指针大小的方法
#include <stdio.h>
int main()
{
printf("int * 指针的大小 %zu 字节\n", sizeof(int *));
printf("char* 指针大小:%zu 字节\n", sizeof(char *));
printf("double * 指针大小: %zu 字节\n", sizeof(double *));
printf("void * 指针大小: %zu 字节\n", sizeof(void *));
return 0;
}
3. 示例输出
在64位系统上输出结果:
int * 指针的大小 8 字节
char* 指针大小:8 字节
double * 指针大小: 8 字节
void * 指针大小: 8 字节
二、数组的大小
数组的大小是指数组占用的总内存字节数,可以通过sizeof运算符获取。
1. 数组大小的计算
- 数组是一块连续的内存空间,存储多个相同类型的元素。
- 数组的大小 = 元素个数 × 每个元素的大小。
sizeof(数组名)返回整个数组占用的字节数。
2. 获取数组大小的方法
#include <stdio.h>
int main() {
int arr[10] = {0};
printf("数组总大小: %zu 字节\n", sizeof(arr)); // 10 * sizeof(int)
printf("数组元素数量: %zu\n", sizeof(arr)/sizeof(arr[0]));
return 0;
}
3. 示例输出
假设int为4字节:
数组总大小: 40 字节
数组元素数量: 10
三、指针与数组大小的区别
|
特性 |
指针 |
数组 |
|
大小 |
固定大小(4或8字节) |
元素数量×元素大小 |
|
sizeof结果 |
指针本身的大小 |
整个数组占用的字节数 |
|
可修改性 |
可以指向不同地址 |
不能重新指向其他数组 |
|
作为参数传递 |
传递指针值(地址) |
退化为指针(丢失大小信息) |
四、重要注意事项
1. 数组作为函数参数时会退化为指针:
void func(int arr[]) { // 实际等同于 int *arr
printf("函数内数组大小: %zu\n", sizeof(arr)); // 输出指针大小,不是数组大小
}
对比示例及结果输出
#include <stdio.h>
void func(int arr[])
{
// ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int *’
printf("函数内数组的大小: %zu\n", sizeof(arr));
}
int main()
{
int arr[10] = {0};
printf("数组总大小: %zu 字节\n", sizeof(arr)); // 10 * sizeof(int)
printf("数组元素数量: %zu\n", sizeof(arr) / sizeof(arr[0]));
func(arr);
return 0;
}
数组总大小: 40 字节
数组元素数量: 10
函数内数组的大小: 8
结果显示:一般数组的大小 = 元素个数 × 每个元素的大小,使用 sizeof(array)计算返回的是整个数组所占用的字节数。如果作为函数参数传入函数内部时,数组退化为指针,sizeof(array)大小也由整个数组的大小变为指针的大小即 8 个字节。
2. 动态分配的"数组"实际上是内存块:
int *dynamic_arr = malloc(10 * sizeof(int));
printf("%zu\n", sizeof(dynamic_arr)); // 输出指针大小,不是数组大小
3. 字符串字面量的特殊情况:
char *str = "hello, world\n";
char array[] = "hello, world\n";
printf("hello,world, 作为char *的大小是%zu, 作为数组的大小是%zu\n", sizeof(str), sizeof(array));
// 结果输出为:
// hello,world, 作为char *的大小是8, 作为数组的大小是14
五、实际应用示例
#include <stdio.h>
#include <stdlib.h>
void func(int arr[], int * ptr)
{
// ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int *’
printf("函数内数组参数的大小: %zu\n", sizeof(arr));
printf("函数内指针参数的大小: %zu\n", sizeof(ptr));
}
//指针和数组大小的比较
int main()
{
printf("int * 指针的大小 %zu 字节\n", sizeof(int *));
printf("char* 指针大小:%zu 字节\n", sizeof(char *));
printf("double * 指针大小: %zu 字节\n", sizeof(double *));
printf("void * 指针大小: %zu 字节\n", sizeof(void *));
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
printf("数组总大小: %zu 字节\n", sizeof(arr)); // 10 * sizeof(int)
printf("数组元素数量: %zu\n", sizeof(arr) / sizeof(arr[0]));
int *ptr = arr;
func(arr, ptr);
int *dynamic_arry = malloc(10 * sizeof(int));
printf("malloc 返回值的大小: %zu\n", sizeof(dynamic_arry));
char *str = "hello, world\n";
char array[] = "hello, world\n";
printf("hello,world, 作为char *的大小是%zu, 作为数组的大小是%zu\n", sizeof(str), sizeof(array));
return 0;
}
int * 指针的大小 8 字节
char* 指针大小:8 字节
double * 指针大小: 8 字节
void * 指针大小: 8 字节
数组总大小: 40 字节
数组元素数量: 10
函数内数组参数的大小: 8
函数内指针参数的大小: 8
malloc 返回值的大小: 8
hello,world, 作为char *的大小是8, 作为数组的大小是14
理解指针和数组大小的区别对于正确使用内存和避免缓冲区溢出等错误非常重要。特别是在处理字符串和动态内存分配时,这些概念尤为重要。
2456

被折叠的 条评论
为什么被折叠?



