C语言中指针的大小和数组的大小有啥区别

一、指针的大小

在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

理解指针和数组大小的区别对于正确使用内存和避免缓冲区溢出等错误非常重要。特别是在处理字符串和动态内存分配时,这些概念尤为重要。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值