当 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)
这样就可以将可变长度的数据传递给printf,printf会通过查找第一个字节0来找出长度。
将包含地址的变量转换为包含值的变量的工作方式如下:
var_with_value = *var_with_address
var_with_address = &var_with_value
"var_with_address"称为指针。
结论: 你需要将字符串作为地址而不是值传递,数字作为值而不是地址传递,这就是你必须使用 [=12 的区别=]
在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)
这样就可以将可变长度的数据传递给printf,printf会通过查找第一个字节0来找出长度。
将包含地址的变量转换为包含值的变量的工作方式如下:
var_with_value = *var_with_address
var_with_address = &var_with_value
"var_with_address"称为指针。
结论: 你需要将字符串作为地址而不是值传递,数字作为值而不是地址传递,这就是你必须使用 [=12 的区别=]