在c编程中,当我们打印一个字符串时。我们没有使用*。但是,当使用printf打印数字时,我们使用的是*。所以它是如何理解的,我正在打印一个字符串或整数。是否了解使用%s运算符?
附加示例代码
#include<stdio.h>
int main(int argc,char* argv){
char data[]="This is an example of pointer";
char *pointerstringdata =data;
printf("print the string data is >> %s\n",pointerstringdata); /* Here we are not using * why? case -1*/
int numberdata =100;
int *pointerintdata=&numberdata;
printf("print the int data is >> %d\n",*pointerintdata); /* Here we are using * why? case -2*/
return 0;
}
答案 0 :(得分:3)
当我们打印一个字符串时。我们没有使用*。但是当使用printf打印数字时,我们使用的是*
因为d
转换说明符期望一个int
,而s
转换说明符期望一个 pointer (指向char
,因此到以0
结尾的char
数组的第一个元素,实际上是C用来模仿的,通常称为“字符串”)。
答案 1 :(得分:2)
C语言没有将字符串视为值的规定。您不能将字符串传递给函数。指针pointerstringdata
只是指向char
的指针,因此*pointerstringdata
是一个char
,而不是字符串。传递*pointerstringdata
仅传递一个字符,而不传递字符串。
要打印字符串,在使用%s
时,printf
期望参数为指针。它使用此指针从内存中读取数据,并读取并打印字符,直到找到空字符为止。
相反,C确实支持将数字视为值,因此它们可以直接传递给函数。
答案 2 :(得分:1)
在
char data[]="This is an example of pointer";
char *pointerstringdata =data;
printf("print the string data is >> %s\n",pointerstringdata); /* Here we are not using * why? case -1*/
如果要打印所有必须提供其地址的字符串,请不要输入*
如果要打印其第一个字符,请执行printf(“%c”,* pointerstringdata);
在
int numberdata =100;
int *pointerintdata=&numberdata;
printf("print the int data is >> %d\n",*pointerintdata); /* Here we are using * why? case -2*/
您不想打印存储在pointerintdata
中的地址,但是该地址中的值相同,因此您必须取消引用
与字符串没有区别...除了要写所有字符串
指针是一个指针,无论它是指向char的指针还是指向int的指针
答案 3 :(得分:1)
%s
格式说明符期望有指针。
如果您传递*pointerstringdata
,则该函数将接收数组中的第一个字符,该字符将尝试取消引用,并可能导致崩溃。
答案 4 :(得分:1)
免责声明:这是关于它对开发人员的外观的说明,而不是编译代码后的外观(特别是因为优化器可能会全部更改)。
C是一种非常底层的语言。您需要了解一个变量始终包含几个字节的值。
C还是使访问大型结构变得非常方便的语言之一。
变量的内容可以是:
没有真正的概念将动态长度变量作为值,因此字符串以及动态长度数组仅在变量中具有地址。
由于字符串的长度是可变的,所以C语言中的约定为:
这样,您可以将可变长度的数据传递给printf,printf会通过查找第一个字节0来找到长度。
将包含地址的变量转换为包含值的变量,如下所示:
var_with_value = *var_with_address
var_with_address = &var_with_value
“ var_with_address”称为指针。
结论:您需要将字符串作为地址而不是值传递,将数字作为值而不是地址传递,这就是为什么必须使用*
答案 5 :(得分:0)
因为指针持有对对象的引用。 *
取消引用此对象。因此,如果指针在取消引用时保留对char对象的引用,则将获得此对象。因此,取消引用char指针只是单个char,而不是字符串中第一个char的地址。