当打印字符串时,我们不使用*。为什么?

时间:2019-01-12 16:14:53

标签: c string printf c-strings conversion-specifier

在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;
}

6 个答案:

答案 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还是使访问大型结构变得非常方便的语言之一。

变量的内容可以是:

  • 一个值(例如您提到的数字)
  • RAM中的地址
  • 使用更多连续ram的结构(C使它好于使用它,就好于使用它)
    • 长度(固定长度)
    • 固定长度的数组

没有真正的概念将动态长度变量作为值,因此字符串以及动态长度数组仅在变量中具有地址。

由于字符串的长度是可变的,所以C语言中的约定为:

  • 在变量中有一个地址
  • 从该地址开始逐字节读取实际数据
  • 读取数据,直到字节为0(NULL)

那叫null-terminated string

这样,您可以将可变长度的数据传递给printf,printf会通过查找第一个字节0来找到长度。

将包含地址的变量转换为包含值的变量,如下所示:
var_with_value = *var_with_address
var_with_address = &var_with_value

“ var_with_address”称为指针。

结论:您需要将字符串作为地址而不是值传递,将数字作为值而不是地址传递,这就是为什么必须使用*

答案 5 :(得分:0)

因为指针持有对对象的引用。 *取消引用此对象。因此,如果指针在取消引用时保留对char对象的引用,则将获得此对象。因此,取消引用char指针只是单个char,而不是字符串中第一个char的地址。