指针的大小--sizeof问题

本文探讨了指针变量在不同情况下所占用的内存空间大小,并指出其与所指向变量的类型无关,主要取决于地址的大小。同时,通过具体实例对比了sizeof与strlen函数的区别。

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

指针的大小是问:一个指针变量占用多少内存空间? 

分析:既然指针只是要存储另一个变量的地址,。注意,是存放一变量的地址,而不是存放一个变量本身,所以,不管指针指向什么类型的变量,它的大小总是固定的:只要能放得下一个地址就行!(这是一间只有烟盒大小的“房间”,因为它只需要入一张与着地址的纸条)。 

存放一个地址需要几个字节?答案是和一个 int 类型的大小相同:4字节。 

所以,若有: 

int* pInt; 

char* pChar; 

bool* pBool; 

float* pFloat; 

double* pDouble; 

则: sizeof(pInt)、sizeof(pChar)、sizeof(pBool)、sizeof(pFloat)、sizeof(pDouble)的值全部为:4。 

PS:你敢拆电脑吗?拆开电脑,认得硬盘数据线吗?仔细数数那扁宽的数据线由几条细线组成?答案:32条,正是 4 * 8。 

附:sizeof和strlen的区别 
❀第一个例子: 
char* ss = "0123456789"; 
1、sizeof(ss)的结果是4,ss是指向字符串常量的字符指针 
2、sizeof(*ss)的结果是1,*ss是第一个字符 

❀第二个例子: 
char ss[] = "01233456789"; 
1、sizeof(ss)结果是11,ss是数组,计算到'/0'的位置,因此是10+1 
2、sizeof(*ss)结果是1,*ss是第一个字符 

❀第三个例子 
char ss[100] = "0123456789"; 
1、sizeof(ss)的结果是100,ss表示在内存中预分配的大小:100*1 
2、strlen(ss)的结果是10,它的内部实现是用一个循环计算字符串的长度,直到'/0'为止。 

❀第四个例子 
int ss[100] = "0123456789"; 
1、sizeof(ss)的结果是400,ss表示在内存中的大小,为100*4 
2、strlen(ss)错误,strlen的参数只能是char*,且必须是以'/0'结尾的。
<think>好的,我现在需要解释用户关于“memset(dp,-1,sizeof)”的问题。首先,用户可能是在学习动态规划或者记忆化搜索时遇到了初始化dp数组的问题,特别是使用C/C++中的memset函数来设置初始值。 首先,我要确认用户的问题点。用户给出的代码片段是“memset(dp,-1,sizeof)”,看起来像是想用memset来将dp数组的所有元素初始化为-1。但这里可能存在语法错误,因为sizeof的参数不正确。正确的用法应该是sizeof(dp)或者sizeof(dp[0])*size,具体取决于上下文。 接下来,我需要分步骤解释memset的作用、正确用法以及常见错误。比如,memset是按字节设置的,所以当用-1时,实际上每个字节都会被设置为0xFF,这在int类型的情况下会导致每个元素为-1,但如果是其他值比如0,可能会有不同的结果。需要提醒用户注意这一点。 然后,用户可能是在初始化dp数组用于记忆化搜索,比如斐波那契数列的例子,这时候初始化为-1可能用来表示未计算的状态。这时候要说明初始化的重要性,以及为什么选择-1而不是其他值。 可能还需要对比其他初始化方法,比如循环遍历数组元素逐个赋值,或者使用fill函数等,说明memset的优缺点,比如效率高但潜在的类型问题。 还要提到常见错误,比如使用memset(dp, -1, sizeof)缺少参数,或者误以为memset可以正确设置非字符类型的值。例如,如果用户想初始化为1,用memset可能会导致每个字节为0x01,从而int的实际值变成0x01010101,这显然不是预期的1。这时候需要强调memset的按字节操作特性。 此外,可能需要给出示例代码,展示正确的使用方式,并指出用户提供的代码中的错误,比如sizeof后面缺少参数,应该改为sizeof(dp)或者计算数组大小的正确方式。 最后,总结正确使用memset的注意事项,以及在动态规划中初始化dp数组的最佳实践,帮助用户避免常见陷阱,确保他们正确应用这一技巧。</think>以下是关于`memset(dp,-1,sizeof)`的详细分步解释: --- ### **步骤1:理解memset的作用** `memset`是C/C++中用于内存块初始化的函数: - **功能**:将指定内存区域的每个字节设置为特定值 - **参数**: `void* memset(void* ptr, int value, size_t num_bytes)` --- ### **步骤2:分析代码问题** 用户提供的代码: ```c memset(dp, -1, sizeof) // 错误写法! ``` **错误点**: 1. `sizeof`缺少参数,应改为`sizeof(dp)`(当`dp`是数组时) 2. 若`dp`是指针(动态分配),需用`n * sizeof(int)`计算总字节数 --- ### **步骤3:正确初始化方式** #### 情况1:静态数组(栈内存) ```c int dp[1000]; memset(dp, -1, sizeof(dp)); // 正确:sizeof(数组名)获取总字节 ``` #### 情况2:动态数组(堆内存) ```c int* dp = new int[1000]; memset(dp, -1, 1000 * sizeof(int)); // 需明确元素数量×单个元素字节数 ``` --- ### **步骤4:为什么用-1?** - **记忆化标记**:在动态规划中常用-1表示“未计算”状态 - **memset特性**: `-1`的二进制补码为全1(`0xFF`),每个字节被设为`0xFF`,组合成int类型后仍为-1 *(仅当类型为有符号整数时成立)* --- ### **步骤5:数值陷阱** **错误示例**: ```c memset(dp, 1, sizeof(dp)); // 不会得到1! ``` - 每个字节被设为`0x01` - 对于4字节int:`0x01010101 = 16843009`(非1) --- ### **步骤6:对比其他初始化方法** | 方法 | 特点 | 适用场景 | |------|------|----------| | `memset` | 快速内存块操作 | 批量设置0/-1等特殊值 | | `for循环` | 精确控制每个元素 | 需要设置不同初始值时 | | `std::fill`(C++) | 类型安全 | 推荐在C++中使用 | --- ### **步骤7:完整DP初始化示例** ```c++ #include <cstring> int main() { const int N = 100; int dp[N]; // 正确初始化 memset(dp, -1, sizeof(dp)); // 所有元素设为-1 // 设置基础值 dp[0] = 0; dp[1] = 1; return 0; } ``` --- ### **关键总结** 1. `memset`按字节操作,仅适合设置0/-1等特殊值 2. 动态数组必须手动计算总字节数 3. 推荐在C++中使用更安全的`std::fill`: ```cpp std::fill(dp, dp + N, -1); // 明确设置每个元素为-1 ``` 通过正确使用内存初始化,可以确保记忆化搜索的DP数组处于可验证状态,避免出现未初始化错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值