当 printf 一个字符串时,我们不使用 *.为什么?

When printf a string we are not using *. Why?

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

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 的指针

when we print a string. We are not using * . But when print a number using printf we are using *

因为 d 转换说明符需要一个 int,而 s 转换说明符需要一个 指针 (到 char 并以此为 0 终止的 char 数组的第一个元素,这实际上是 C 用来模仿通常所谓的 "string").

%s 格式说明符需要一个指针。

如果您传递 *pointerstringdata 函数将接收数组中的第一个字符,函数将尝试取消引用该字符,并可能导致崩溃。

因为指针持有对对象的引用。 * 取消引用此对象。因此,如果指针在我们取消引用它时持有对 char 对象的引用,我们就会得到这个对象。所以取消引用 char 指针只是单个 char 而不是字符串中第一个 char 的地址。

C 语言没有将字符串视为值的规定。您不能将字符串传递给函数。指针 pointerstringdata 只是一个指向 char 的指针,所以 *pointerstringdata 是一个 char,而不是一个字符串。传递 *pointerstringdata 将只传递一个字符,而不是字符串。

要打印字符串,当使用 %s 时,printf 期望参数是一个指针。它使用此指针从内存中读取,读取并打印字符,直到找到空字符。

相比之下,C 确实支持将数字视为值,因此它们可以直接传递给函数。

免责声明:这是对开发人员的解释,而不是编译代码后的样子(特别是因为优化器可能会更改所有内容)。


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"称为指针。

结论: 你需要将字符串作为地址而不是值传递,数字作为值而不是地址传递,这就是你必须使用 [=12 的区别=]