C++ char * p char p[] sizeof(p)

本文详细解析了C++中sizeof与strlen函数的区别:sizeof用于获取变量或数据类型所占内存字节数,包括结束符;而strlen用于计算字符串长度,不包括结束符。此外,还介绍了数组作为参数传递时的特性。

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

char *  p = "12345";

char p[] = "12345";

sizeof(p) = 4 ; //指针长度为4

sizeof(p) = 6; //还加上了最后一个结束符'/0' , 可见sizeof 是用来求所占内存的字节数的!

sizeof在编译期间就确定了,所以求得是所占内存的字节数!

而strlen(p)都是5 , 不包含最后一个'/0' 

strlen是运行期间确定的

例如: char p[20]="0123456789";

sizeof(p) = 20;

strlen(p) = 10;

另外:

fun(char [8])
fun(char [])
都等价于 fun(char *)

在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小

<think>好的,我现在需要回答用户关于C/C++sizeof指针变量结果的问题。用户引用了三个资料,我需要结合之前的回答和这些资料来详细解释。 首先,用户之前的问题是关于sizeof操作符的深度解析,其中已经提到了指针的大小。比如在动态数组的例子中,sizeof(p)的结果是4(32位系统)。现在用户特别询问指针变量的sizeof结果,我需要详细说明这一点。 根据引用[1],用户提供的测试程序中,char *b、int *c、char *d的sizeof结果都是指针的大小,而不管它们指向的数据类型或内存大小。比如在32位系统下,所有指针的sizeof都是4字节,64位则是8字节。这和之前的回答一致,即指针变量的大小取决于系统架构,而不是指向的数据类型。 引用[3]提到sizeof计算结构体大小的问题,但这里用户的问题集中在指针变量本身。所以需要强调指针本身的大小是固定的,无论它指向的是何种类型的数据,或者是否动态分配了内存。例如,int *c = new int[20]; 这里的sizeof(c)仍然是4(32位),因为c是一个指针,不是数组。 此外,用户提供的示例代码中的printf输出也验证了这一点:sizeof(b)sizeof(c)sizeof(d)都返回指针的大小,而sizeof(*b)sizeof(*c)则返回所指向类型的大小。这需要明确区分指针变量和指针解引用后的类型大小。 还要注意,在函数参数中,数组会退化为指针,所以sizeof(数组参数)也会返回指针的大小,而不是整个数组的大小,这在之前的回答中也提到过。比如void func(char a[3])中,sizeof(a)是4(32位)。 另外,需要解释不同系统架构下的差异,比如32位和64位系统中指针大小的不同。之前的回答表格里提到long类型在32位和64位下的差异,但指针的大小同样受此影响,这点需要补充说明。 用户可能存在的误区是认为sizeof(指针)会返回指向数据的大小,比如动态分配的数组,但实际上sizeof(指针)始终是固定的。例如int *p = new int[10]; sizeof(p)始终是4或8,而不是40或80。这一点需要明确强调,避免用户混淆指针和数组在sizeof中的行为差异。 总结回答的结构应该是:先明确指针变量sizeof的结果取决于系统架构,与类型无关,然后通过示例代码和引用资料中的例子说明,最后指出常见误区和注意事项,如动态内存分配不影响指针大小,数组退化为指针的情况等。</think>### C/C++中指针变量的`sizeof`结果解析 --- #### 一、核心结论 **指针变量的`sizeof`结果仅由系统架构决定**,与指针类型、指向内容无关: - **32位系统**:固定为 **4字节** - **64位系统**:固定为 **8字节** **示例验证**(引用[1]的测试代码): ```cpp char* b; // sizeof(b) = 4(32位) int* c = new int[20]; // sizeof(c) = 4(32位) char* d = "HelloWorld!"; // sizeof(d) = 4(32位) ``` 所有指针变量的`sizeof`结果均相同[^1][^3]。 --- #### 二、关键特性说明 ##### 1. **与指针类型无关** 无论指针指向何种数据类型,`sizeof`仅计算指针本身的内存占用: ```cpp int* p1; // sizeof(p1) = 4(32位) double*** p2; // sizeof(p2) = 4(32位) void(*p3)(); // sizeof(p3) = 4(32位,函数指针) ``` ##### 2. **与动态内存分配无关** 即使指针指向动态分配的数组,`sizeof`仍返回指针大小: ```cpp int* p = new int[100]; cout << sizeof(p); // 输出4(32位),而非400[^1] ``` ##### 3. **指针解引用的差异** `sizeof(*指针)`会计算**指向类型**的大小: ```cpp char* b; // sizeof(*b) = 1(char类型大小) int* c; // sizeof(*c) = 4(int类型大小) double* d; // sizeof(*d) = 8(double类型大小) ``` --- #### 三、常见应用场景 ##### 1. **数组退化指针的陷阱** 当数组作为函数参数时,`sizeof`返回指针大小: ```cpp void func(int arr[10]) { cout << sizeof(arr); // 输出4(32位),而非40[^3] } ``` ##### 2. **类型安全检查** 通过`sizeof`验证指针操作的正确性: ```cpp int* p = malloc(sizeof(int) * 10); if (sizeof(p) != 4) { // 检查指针大小是否符合预期 // 处理64位系统适配问题 } ``` ##### 3. **跨平台开发注意事项** 通过指针大小判断系统架构: ```cpp #if sizeof(void*) == 4 cout << "32位系统"; #elif sizeof(void*) == 8 cout << "64位系统"; #endif ``` --- #### 四、与数组的对比 | **特性** | **指针变量** | **静态数组** | |--------------------|-----------------------|-----------------------| | `sizeof`结果 | 固定4/8字节 | 数组总字节数 | | 内存分配方式 | 动态/静态 | 静态 | | 函数参数传递行为 | 传递指针地址 | 退化为指针 | **示例**: ```cpp char arr[20]; // sizeof(arr) = 20 char* p = arr; // sizeof(p) = 4(32位) ``` --- #### 五、常见误区 1. **混淆指针与数组** ```cpp int* p = new int[5]; cout << sizeof(p) / sizeof(int); // 错误!实际计算的是4/4=1(32位) ``` 2. **误判字符串指针大小** ```cpp const char* str = "Hello"; cout << sizeof(str); // 输出4(指针大小),而非6[^1] ``` --- ### 相关问题 1. 如何通过`sizeof`判断当前系统是32位还是64位? 2. 为什么函数指针的`sizeof`结果与数据指针相同? 3. `sizeof(void*)`在不同编译器下的表现是否一致? 4. 动态分配的二维数组如何正确计算总内存大小? 5. 指针运算(如`p++`)是否会影响`sizeof`的结果? --- ### 代码示例 ##### 指针与数组的`sizeof`对比 ```cpp #include <iostream> using namespace std; int main() { int arr[5] = {1,2,3,4,5}; int* p = arr; cout << "sizeof(arr): " << sizeof(arr) << endl; // 输出20(5*4) cout << "sizeof(p): " << sizeof(p) << endl; // 输出4(32位指针) return 0; } ``` ##### 引用标注 [^1]: 指针变量的`sizeof`与动态内存无关性 [^3]: 数组参数退化为指针的特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值