-3

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

6 回答 6

3

当我们打印一个字符串时。我们没有使用 * 。但是当使用 printf 打印一个数字时,我们使用 *

因为d转换说明符需要一个int,而s转换说明符需要一个指针(指向 achar并以此指向以 -0终止的char数组的第一个元素,这实际上是 C 用来模仿通常称为“字符串”的东西)。

于 2019-01-12T16:27:54.050 回答
2

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

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

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

于 2019-01-12T16:55:27.527 回答
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 的指针

于 2019-01-12T16:26:09.343 回答
1

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

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

于 2019-01-12T16:29:06.027 回答
1

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


C是一种非常低级的语言。您需要了解变量总是包含几个字节的值。

C 也是使访问更大结构变得非常方便的语言之一。

变量的内容可以是:

  • 一个值(例如:正如你提到的一个数字)
  • RAM 中的地址
  • 一个使用更多连续 ram 的结构(而 C 使它很好地使用它,就好像它不止于此)
    • stuct(固定长度)
    • 固定长度的数组

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

由于 stings 是可变长度的,C 中的约定是:

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

这称为空终止字符串

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

将包含地址的变量转换为包含值的变量的工作方式如下:
var_with_value = *var_with_address
var_with_address = &var_with_value

“var_with_address”称为指针。

总之:您需要将字符串作为地址而不是值传递,数字作为值而不是地址传递,这就是您必须使用的区别*

于 2019-01-12T16:56:54.220 回答
0

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

于 2019-01-12T16:29:41.147 回答