char* 和 int* 的解引用运算符 (*) 有什么不同?

5
为什么访问 int* 变量的值需要使用操作符 (*),但访问 char* 变量时不需要?
char *char_ptr; 
int *int_ptr;
int mem_size = 50;

char_ptr = (char *) malloc(mem_size);
strcpy(char_ptr, "This is memory is located on the heap.");
printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);


int_ptr = (int *) malloc(12);
*int_ptr = 31337; 
printf("int_ptr (%p) --> %d\n", int_ptr, *int_ptr);

输出:

char_ptr (0x8742008) --> 'This is memory is located on the heap.' 
int_ptr (0x8742040) --> 31337

2
提醒一下:不要忘记为每个 malloc() 提供一个 free() - Sean Francis N. Ballais
@SeanFrancisN.Ballais,这只是一本书中的代码的一部分,谢谢! - w33haa
1
@w33haa 但是Sean是对的:内存泄漏比使用错误类型的指针调用printf更严重。 - Mr Lister
4个回答

7
这是因为printf格式说明符的工作方式:对于其相应的参数,%s格式说明符期望一个指向字符的指针(更准确地说,是一个指向以nul结尾的字符串的地址——它可以是一个char数组、一个至少有一个零字节的已分配缓冲区或一个字符串字面量),所以你可以直接将char_ptr变量提供给它;另一方面,%d格式说明符期望一个整数(而不是指向整数的指针),因此你必须使用*运算符解引用int_ptr变量。

关于良好的编程风格:如你问题中的注释所提到的,确保在使用malloc分配缓冲区后,在某个时刻调用free(),否则会在代码中引入内存泄漏。另请参阅:我需要对malloc的结果进行强制类型转换吗?


0

你也可以使用表达式*char_ptr。它的类型是char,该表达式将产生指向字符'T'的指针,即存储的字符串文字的第一个字符。

这与*int_ptr相同,它返回分配的整数数组的第一个元素。

至于转换说明符%s,它期望一个指向字符串的char *类型的参数。另一方面,转换说明符%d期望一个int类型的对象。

您可以使用转换说明符%c。来输出指向字符串的单个字符,例如:

printf( "%c", *char_ptr );

0
对于任何指针或数组 p 和索引 i,表达式 p[i] 等价于 *(p + i)。由此可得,*p 等同于 p[0]
在你的情况下,*int_ptr 等同于 int_ptr[0]
如果你对 char_ptr 做同样的操作(即 *char_ptr),你将得到一个单个字符的 char_ptr[0],它也可以用 %d 打印出来:
printf("char_ptr (%p) --> '%d'\n", char_ptr, *char_ptr);

这将打印字符串中第一个字符的十进制表示。


2
不回答提问者的问题,只会让他更加困惑。@Adrian Mole 回答了原始问题。 - Tony

0
为什么需要运算符 (*) 来访问 int* 变量的值,而不是 char*
因为在 printf() 函数中,格式说明符 %s 需要匹配类型为 char * 的参数 - 指向字符串的指针,而 %d 需要类型为 int 的参数。
在后一种情况下,解引用运算符 * 是必需的,以解引用 int_ptr 并产生 int_ptr 指向的 int 对象的值。
由于 char_ptr 已经是所需的 char* 类型,因此无需对其进行解引用。

附注:

1.

int_ptr = (int *) malloc(12);

请注意,在大多数现代系统上,使用12个字节只能分配1个int对象,因为它需要8个字节。剩余的4个字节不足以容纳另一个int。
如果您想为一个int分配空间,请使用sizeof(* int_ptr):
int_ptr = (*int) malloc(sizeof(*int_ptr));

2.

同时不要忘记在使用完malloc()分配的存储空间后,调用free()释放它:

free(int_ptr);
free(char_ptr);

3.

此外,在使用malloc()时,无需对其返回值进行强制类型转换:我需要对malloc的结果进行强制类型转换吗?

char_ptr = malloc(mem_size);
int_ptr = malloc(sizeof(*int_ptr));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接