指针 & 数组大总结

本文深入探讨C语言中数组、字符数组、字符串及指针的sizeof与strlen函数的用法,解析不同数据结构在内存中占用的空间大小及其长度的计算方式。通过实例展示,帮助读者理解这些函数在编程实践中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
//int a[] = { 9,5,2,7 };
//printf("%d\n", sizeof(a));//16 数组的大小
//printf("%d\n", sizeof(a + 0));//4 int*
//printf("%d\n", sizeof(a));//4 int
//printf("%d\n", sizeof(a + 1));//4 int

//printf("%d\n", sizeof(a[1]));//4 int
//printf("%d\n", sizeof(&a));//4 int()[4];
//printf("%d\n", sizeof(&a + 1));//4 原因同上
//printf("%d\n", sizeof(
&a));//16 int [4]
//printf("%d\n", sizeof(&a[0]));//4 int*
//printf("%d\n", sizeof(&a[0] + 1));//4 int*
//##########################################################################
//char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’ };
//printf("%d\n", sizeof(arr));//6 字符数组的长度
//printf("%d\n", sizeof(arr + 0));//4 char*
//printf("%d\n", sizeof(arr));//1 char
//printf("%d\n", sizeof(arr[1]));//1 char
//printf("%d\n", sizeof(&arr));//4 char(
)[6]
//printf("%d\n", sizeof(&arr + 1));//4 原理同上
//printf("%d\n", sizeof(&arr[0] + 1));//4 char*
//***************************************
//printf("%d\n", strlen(arr));
//printf("%d\n", strlen(arr + 0));
//printf("%d\n", strlen(arr));
//printf("%d\n", strlen(arr[1]));
//printf("%d\n", strlen(&arr));
//printf("%d\n", strlen(&arr + 1));
//printf("%d\n", strlen(&arr[0] + 1));
//对字符数组千万不能使用strlen,这是一个非常愚蠢的行为
//因为strlen始终是在寻找’\0’
//而字符数组和字符串不同,它并没有’\0’这个字符
//####################################################
//char arr[] = “abcdef”;
//printf("%d\n", sizeof(arr));//7 字符数组的长度
//printf("%d\n", sizeof(arr + 0));//4 char

//printf("%d\n", sizeof(arr));//1 char
//printf("%d\n", sizeof(arr[1]));//1 char
//printf("%d\n", sizeof(&arr));//4 char(
)[7]
//printf("%d\n", sizeof(&arr + 1));//原理同上
//printf("%d\n", sizeof(&arr[0] + 1));//4 char*
// //#######################################################
// printf("%d\n", strlen(arr));//6 字符串长度,当然这里的长度并不包括’\0’
// printf("%d\n", strlen(arr + 0));//6 从第二个字符数到’\0’
//// printf("%d\n", strlen(arr));//愚蠢的行为… 对一个字符strlen 指针将访问未定义区域
//// printf("%d\n", strlen(arr[1]));//同上一样愚蠢
// printf("%d\n", strlen(&arr));// 6 虽然愚蠢,但运气好,正好可以求得6但他的类型其实是由char(
)[7]隐式转化为const char*
// //printf("%d\n", strlen(&arr + 1));//这样就不行了 对char()[7]+1 指针越过了整个字符串因此找不到相应的’\0’
// printf("%d\n", strlen(&arr[0] + 1));//5 char
+1
//###################################################################
//char* p = “abcdef”;
//printf("%d\n", sizeof§);//4 只是个const char不要多想
//printf("%d\n", sizeof(p + 1));// 4 char

//printf("%d\n",sizeof(p));//1 char
//printf("%d\n", sizeof(p[0]));//1 char
//printf("%d\n", sizeof(&p));//4 char
*
//printf("%d\n", sizeof(&p + 1));//4 char**
//printf("%d\n", sizeof(p[0] + 1));//4 char*
//#######################################################
//printf("%d\n", strlen§);//7 数7下到达’\0’
//printf("%d\n", strlen(p + 1));//6 同上
//printf("%d\n", strlen(p));//愚蠢行为 单个字符strlen得到野指针
//printf("%d\n", strlen(p[0]));//同上
//printf("%d\n", strlen(&p));//未定义行为
// printf("%d\n", strlen(&p + 1));//未定义行为
// printf("%d\n", strlen(p[0] + 1));//单个字符取strlen
//##################################################
//int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
//printf("%d\n", sizeof(arr));//40 数组的长度
//printf("%d\n", sizeof(arr[0][0]));//4 int
//printf("%d\n", sizeof(arr[0]));// 20 int[5]
//printf("%d\n", sizeof(arr[0] + 0));//4 int

//printf("%d\n", sizeof(arr[0] + 1));//4 int
//printf("%d\n", sizeof(arr + 1));//4 int(
)[5]
//printf("%d\n", sizeof((arr + 1)));//20 int[5]未定义行为
//printf("%d\n", sizeof(&arr[0] + 1));//4 int(
)[5]
//printf("%d\n", sizeof(&arr[0] + 1));//4 int
//printf("%d\n", sizeof(*arr));//20 int[5]
//printf("%d\n", sizeof(arr[3]));//20 sizeof()运算在编译器已经完成
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值