我什么时候应该使用带有scanf(&)的&符号

Dko*_*ova 18 c string scanf

使用时在c中使用&符有什么规则scanf()

struct Student 
{
  char name[20];
  int id;
};

int main(void)
{
  struct Student std1;
  printf("enter name and id of std1\n");
  scanf("%s %d", std1.name, &(std1.id));
}
Run Code Online (Sandbox Code Playgroud)

为什么对于String我不需要使用&符号,因为int我必须使用它?

是否有关于何时使用&符号的规则?

Gan*_*har 25

scanf将特定类型的数据读入地址,这些地址作为第二个,第三个,第四个等参数传递...

int var;
scanf("%d",&var);
Run Code Online (Sandbox Code Playgroud)

这里var是值,&var是地址

char s[20];
scanf("%s",s);
Run Code Online (Sandbox Code Playgroud)

上面的语句说==>读取%d(整数)类型的数据到&var地址


#include<stdio.h>
#define MAX 5

int main()
{
    int a[MAX];
    int i;
    printf("Enter Values of array\n");
    for(i=0;i<MAX;i++)
    {
        printf("Enter a[%d] =  ",i);
        scanf("%d",&a[i]); // reading each time single integer value starting index with 0 and ending index MAX-1.
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的地址不是价值.因为这里是一个包机数组(我们称之为字符串)

数组名称本身表示其地址. s ==&s [0],这两者都是一样的.

scanf("%d",a);
printf("a[0]=%d\n",a[0]);
Run Code Online (Sandbox Code Playgroud)

上面的语句说==>读取%s(字符数组)数据的类型,从s开始到地址位置.


#include<stdio.h>
#define MAX 5

int main()
{
    int a[MAX];
    int i;
    int *ptr;
    ptr = &a[0];
    printf("Enter Values of array\n");
    for(i=0;i<MAX;i++)
    {
        printf("Enter a[%d] =  ",i);
        scanf("%d",ptr);
        ptr++; //moving pointer 
    }
}
Run Code Online (Sandbox Code Playgroud)

请看这个代码

#include<stdio.h>
#define MAX 5

int main()
{
    int a[MAX];
    int i;
    int *ptr;
    ptr = &a[0];
    printf("Enter Values of array\n");
    for(i=0;i<MAX;i++)
    {
        printf("Enter a[%d] =  ",i);
        scanf("%d",ptr+i); //we are not moving ptr position we scaning each time into next location by incrementing i 
    }
}
Run Code Online (Sandbox Code Playgroud)

在C中我们没有任何单个格式说明符一次扫描整数组,就像在%s的帮助下扫描字符组一样.

这里a =&a [0];

您可以直接将单个整数值扫描到a指向的地址.

int a[5][5];
Run Code Online (Sandbox Code Playgroud)

如果输入10则打印一个[0] = 10.

指针的用法:

如果您使用如下所示的指针,那么您将会知道.如何递增指针并将值放入数组的不同位置.

您可以移动指针位置以读取数组.你可以读出没有移动指针位置的数组.

1.通过移动指针位置来读取数组

#include<stdio.h>
#define MAX 5

int main()
{
    int a[MAX][MAX],i,j;
    int *pointer[MAX];

    for(i=0;i<MAX;i++)
        pointer[i]=&a[i][0]; //initializes the pointers 

    printf("Enter elements :\n");
    for(i=0;i< MAX;i++)
    {   
        for(j=0;j<MAX;j++)
        {
            printf("Enter the a[%d][%d] element: ",i,j);
            scanf("%d",pointer[i]+j); //each time you will move like 00 01 02 03 04 and second time 10 11 12 13 14 and so on...
            //printf("%u or %x",pointer[i]+j,pointer[i]+j);//un comment this line and see the addresses how the address incrementing for each element
        }
    }

    printf("The Given Matrix:\n\n");
    for(i=0;i<MAX;i++)
    {
        for(j=0;j<MAX;j++)
        {
            printf("%d",*(pointer[i]+j));
            printf("\t\t");
        }
        printf("\n\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

2.读出没有移动指针位置的数组

printf("Enter elements :\n");
for(i=0;i< MAX;i++)
{   
    for(j=0;j<MAX;j++)
    {
        printf("Enter the a[%d][%d] element: ",i,j);
        scanf("%d",&a[i][j]); //we can't do like this a++ or ++a or a+i this is illegal in C. for that purpose we are using pointers  
    }
}
Run Code Online (Sandbox Code Playgroud)

当指针递增时,增量取决于指针的类型.这里ptr是整数指针,因此ptr + 1将增加ptr + sizeof(int)位置.


int var;
scanf("%d",&var);
Run Code Online (Sandbox Code Playgroud)

这是二维数组,所以你需要5个指针来扫描,所以我被声明为指针数组.

char s[20];
scanf("%s",s);
Run Code Online (Sandbox Code Playgroud)

直接扫描

#include<stdio.h>
#define MAX 5

int main()
{
    int a[MAX];
    int i;
    printf("Enter Values of array\n");
    for(i=0;i<MAX;i++)
    {
        printf("Enter a[%d] =  ",i);
        scanf("%d",&a[i]); // reading each time single integer value starting index with 0 and ending index MAX-1.
    }
}
Run Code Online (Sandbox Code Playgroud)

你将在下面的书中找到上述大部分内容.

请转到此链接:阅读维基并阅读
C编程语言(第二版) - Brian W. Kernighan和Dennis M. Ritchie


Yu *_*Hao 7

因为C字符串有一个类型char [].数组名称具有其地址的值,但是int您不需要使用变量&

写作是错误的void main,你应该经常使用int main.