解引用运算符(*)char *和int *之间的区别

为什么需要操作符(*)访问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
safeact2 回答:解引用运算符(*)char *和int *之间的区别

这是因为printf格式说明符的工作方式:%s格式期望其对应的参数指向字符的指针(更准确地说,以nul结尾的string的地址-可以是char的数组,其中至少包含一个零字节的已分配缓冲区或string literal),因此您可以按原样为其提供char_ptr变量;另一方面,%d格式需要一个整数(不是指向整数的指针),因此您必须使用{{1}来取消引用int_ptr变量}运算符。

有关良好编程风格的说明:如您的问题注释中所述,请务必在分配给*的每个缓冲区的某个时刻调用free(),否则您将引入{{ 3}}插入您的代码。另请参见:memory leaks

,

您还可以使用表达式*char_ptr。它的类型为char,表达式将产生指向字符'T'-存储的字符串文字的第一个字符。

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

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

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

printf( "%c",*char_ptr );
,

对于任何指针或数组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);

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

,

“为什么需要运算符(*)访问int*变量的值而不是char*的变量?”

由于在printf()函数中,格式说明符%s期望类型为char *的匹配参数-指向字符串的指针,而%d期望类型的参数int

在后一种情况下,需要解除引用运算符*来解除对int_ptr的引用,并产生int对象int_ptr所指向的值。

由于char_ptr已要求char*已经是%s类型,因此无需取消引用。


旁注:

1。

int_ptr = (int *) malloc(12);

请注意,在大多数现代系统中,使用12个字节,您只能分配1个int对象,因为它需要8个字节。剩余的4字节不足以容纳另一个字节。

如果仅要为一个int分配空间,请使用sizeof(*int_ptr)

int_ptr = (*int) malloc(sizeof(*int_ptr));

2。

也不要忘记free()在使用后为malloc()分配的存储空间:

free(int_ptr);
free(char_ptr);

3。

此外,无需强制转换malloc()的返回值:Do I cast the result of malloc?

char_ptr = malloc(mem_size);
int_ptr = malloc(sizeof(*int_ptr));
本文链接:https://www.f2er.com/2407775.html

大家都在问