19

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

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

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

4

3 回答 3

29

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

int var;
scanf("%d",&var);

var是价值,&var是地址。上面的语句说:将%d(整数)类型的数据读入&var地址。

char s[20];
scanf("%s",s);

s是地址而不是值,因为s是字符数组(字符串)。数组名本身表示它的地址。s == &s[0],它们都是一样的。

上面的语句说:将%s(字符数组)类型的数据读入地址位置,从s.

#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.
    }
}

没有单一的格式说明符可以一次扫描一组整数,就像在 %s 的帮助下一次扫描一组字符一样。

在这里,a=&a[0];您可以将单个整数值直接扫描到 . 指向的地址a

scanf("%d",a);
printf("a[0]=%d\n",a[0]);

如果您输入10,则打印a[0]=10.

指针的用法:

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

您可以移动指针位置以读取数组。您可以在不移动指针位置的情况下读取数组。

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

    #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 
        }
    }
    
  2. 在不移动指针位置的情况下读取数组。

    #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 
        }
    }
    

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

int a[5][5];

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

#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");
    }
}

直接扫描

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

您将在Brian W. Kernighan 和 Dennis M. Ritchie的 The C Programming Language(第二版)中找到上述大部分内容。

于 2013-08-23T13:13:19.680 回答
8

因为 C 字符串的类型为char []. 数组名有它的地址的值,但int变量没有,你需要使用&

而且写错了void main,你应该总是使用int main.

于 2013-08-23T12:44:14.793 回答
1

在 C 中,字符串是字符数组(以\0字符结尾)。

数组名返回数组第一个元素的指针(存储数组的内存位置),标量变量名返回标量的值,所以需要使用&运算符来获取你所在的标量的内存位置需要写入值。

于 2013-08-23T12:42:54.123 回答