这是因为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