gpt4 book ai didi

c - 需要解释在什么情况下我们应该在C中将&与printf一起使用

转载 作者:行者123 更新时间:2023-11-30 20:50:12 26 4
gpt4 key购买 nike

据我在c中使用printf()时不使用&.Right,但是在我的程序中,如果我不在显示功能中使用它,则会给我一个错误,有人可以解释吗?谢谢

#include<stdio.h>
#define max 100
void enqueue();
char dequeue(void);
int front=-1,rear=-1,option;
char name[max][max],val;
void display(void);


void enqueue() {

printf("Enter the name of the paitent : ");
if(rear==max-1)
printf("Line is full");
else if (front==-1 && rear==-1)
front=rear=0;
else
rear++;
scanf("%s",&name[rear][rear]);

}

char dequeue(void) {
char val;
if(front==-1 || front >rear )
printf("Line is empty");
else
{
val=name[front];
front++;
if(front>rear)
front=rear=-1;
return val;
}
}
void display(void) {
int i;
if(front==-1|| front >rear)
printf("The queue is empty");
else
{
for(i=front; i<=rear; i++) {
printf("%s\t",&name[i][i]);
}
}

}



int main () {
printf("\n\n*******Medical Cneter********");
printf("\n\t1. Insert a paitent");
printf("\n\t2. Remove a paitent");
printf("\n\t3. Check Paitent list");
printf("\n\t4. Display");
printf("\n\t5. Exit");
do {
printf("\nEnter your option: ");
scanf("%d",&option);
switch(option)
{
case 1:
enqueue();
break;
case 2:
dequeue();
break;
// case 3:
case 4:
display();
break;
}

} while(option !=5);

}


如果我不使用&程序将崩溃。据我在c中使用 printf()时所知,我们并未使用。但是在我的程序中,如果我没有在显示功能中使用它,则会给我一个错误,有人可以解释吗?谢谢

最佳答案

为了回答您的问题,让我们回顾一下&运算符的作用,需要传递给printf的值的类型,以及为了进行比较,我们需要传递给scanf的值的类型。

如果您有东西x,则表达式&x为您提供指向x的指针。如果xint,则&x给出指向int的指针。如果xchar,则&x给出指向char的指针。

例如,如果我写

int i;
int *ip;
ip = &i;


我已经声明了一个 int变量 i和一个指向int的指针变量 ip。我已使用 &运算符创建指向 i的指针,并将该指向 int的指针存储在变量 ip中。一切都很好。

如您所知,当您调用 scanf时,始终必须将指针传递给您希望 scanf为其填充的变量。你不会写

scanf*"%d %d", x, y);    /* WRONG */


因为这会将变量 xy的值传递给 scanf。但是,您不想将值传递给 scanf,而是希望 scanf从用户读取一些值,然后将其传送回给您。实际上,您希望 scanf写入变量 xy。这就是为什么将指针传递给 xy的原因,以便 scanf可以使用指针来填充变量。因此,这就是为什么您几乎总是在 &调用的参数中看到 scanf的原因。

但是,这些原因均不适用于 printf。调用 printf时,确实希望将普通值传递给它。您通常不会要求 printf将任何数据传回给您。因此,大多数 printf格式说明符都定义为接受普通值,而不是指向值的指针。这就是为什么您几乎看不到 &调用中的 printf的原因。

现在,您可能会想到 &是一个将对象“转换为指针”的运算符,但这并不是思考它的好方法。就像我说的,给定对象 x,表达式 &x构造指向 x的指针。它不会“转换”任何东西;它当然不会“转换” x。它构造一个指向 x的全新指针值。

在您发布的代码中,您似乎使用 &试图执行这种“转换”。您有一个数组 name,其类型为array-of-array-of- char,或者是二维字符数组。您试图使用 %s打印字符串。您知道,或者您的编译器警告您, %s需要一个指向字符的指针,并且您知道(或您的编译器告诉您)表达式 name[i][i]给出了类型为 char的值。现在,按照 &的要求,在 name[i][i]前面放置 char的确确实得到了指向 %s的类型的指针值,它似乎甚至可以工作,但这是一个偶然的解决方案。

的确, printf%s需要一个指向 char的指针,但它并不需要任何指向 char的指针。它需要指向 char的指针,该指针指向有效的,以null终止的字符串。这就是为什么即使 %s需要一个指针,您仍然通常不会在 &调用中看到 printf的原因。您可以在单个字符变量上使用 &以获得指向该字符的指针,如下所示:

char c = 'x';
printf("%s", &); /* WRONG */


但这是残破的代码,将无法正常工作,因为您获得的指针不是有效的字符串,因为没有空终止。

在您的代码中,您可能想更改该行

printf("%s\t",&name[i][i]);




printf("%s\t",name[i]);


namechar的二维数组,但是由于C中的字符串是 char的数组,因此您也可以将 name视为字符串的(一维)数组,我认为这就是您尝试使用它的方式。

同样,我怀疑您想更改行

scanf("%s",&name[rear][rear]);




scanf("%s", name[rear]);


但是在您说“我以为 scanf总是需要 &!”之前,请记住,规则是 scanf需要一个指针。而且由于 name[i]是一个数组,当将其传递给 scanf时(或者实际上在任何表达式中使用它时),您会自动获得指向其第一个元素的指针。 (这也是 printf("%s\t",name[i])背后的原因。)

如果要使用显式的 &,则需要的是指向要 scanf填充的字符串数组开头的指针,所以我想

scanf("%s", &name[rear][0]);


而不是您拥有的表情。

(看起来您可能是偶然地将字符串沿 name数组的对角线而不是沿左边缘运行。您也很奇怪地声明了完美的正方形数组

char name[max][max];


即100个字符串,每个字符串100个字符。没错,它可以工作,但是很好奇,而且可以更轻松地混合行和列。)

`

关于c - 需要解释在什么情况下我们应该在C中将&与printf一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49392225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com