在C/C++中,int类型指针和字符串类型指针(通常指char*)虽然都是指针,但在用法和语义上有显著差别。以下是主要区别:
1. 指向的数据类型不同
-
int*(整型指针)
指向一个或多个整型数据(int)。c
复制
下载
int num = 42; int* pInt = # // 指向单个int int arr[] = {1, 2, 3}; int* pArr = arr; // 指向int数组 -
char*(字符指针/字符串指针)
通常指向字符数组(即C风格字符串),以空字符\0结尾。c
复制
下载
char str[] = "Hello"; char* pStr = str; // 指向字符串的首字符
2. 解引用时的行为不同
-
int*
解引用后访问的是一个完整的int值(通常是4字节,取决于平台)。c
复制
下载
int x = *pInt; // 获取pInt指向的整数值(如42)
-
char*
解引用后访问的是单个字符(1字节)。c
复制
下载
char c = *pStr; // 获取pStr指向的字符(如'H')
3. 指针运算的步长不同
-
int*
指针加减的步长为sizeof(int)(如+1跳过4字节)。c
复制
下载
pInt++; // 指向下一个int(地址增加4字节)
-
char*
指针加减的步长为sizeof(char)(即1字节)。c
复制
下载
pStr++; // 指向下一个字符(地址增加1字节)
4. 字符串指针的特殊语义
-
char*
可以指向字符串字面量(常量),但修改它是未定义行为(可能导致崩溃)。c
复制
下载
char* pLiteral = "Hello"; // 指向只读内存 // pLiteral[0] = 'h'; // 错误!不允许修改
-
int*
无此类特殊语义,通常指向可修改的内存。
5. 输入/输出处理
-
int*
用于传递整型变量或数组的地址(如scanf输入):c
复制
下载
scanf("%d", pInt); // 通过指针修改int值 -
char*
可直接用于字符串输入/输出(如printf/scanf):c
复制
下载
printf("%s", pStr); // 输出整个字符串 scanf("%s", pStr); // 输入字符串(需确保内存足够)
6. 内存布局
-
int*
指向的数据可能是单独变量或数组,无终止符。 -
char*
字符串以\0结尾,需确保内存分配足够(如strlen和strcpy依赖终止符)。
示例对比
c
复制
下载
int nums[] = {10, 20, 30};
int* pNums = nums; // 指向int数组
char name[] = "Alice";
char* pName = name; // 指向字符串
printf("%d\n", *pNums); // 输出: 10(解引用int)
printf("%c\n", *pName); // 输出: 'A'(解引用char)
printf("%s\n", pName); // 输出: "Alice"(字符串语义)
关键区别总结
| 特性 | int* | char*(字符串指针) |
|---|---|---|
| 指向类型 | 整型(int) | 字符(char) |
| 解引用结果 | 整数值 | 单个字符 |
| 指针运算步长 | sizeof(int) | sizeof(char)(1字节) |
| 终止符 | 无 | 以\0结尾 |
| 输入/输出 | 需格式化为%d | 可直接用%s处理字符串 |
| 常量字面量 | 无特殊语义 | 可能指向只读内存 |
理解这些区别能帮助避免常见的指针误用(如越界访问或类型不匹配)。

1万+

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



