Подтвердить что ты не робот

Когда следует использовать амперсанд с 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));
}

Почему для String мне не нужно использовать амперсанд, а для int я должен использовать его?

Есть ли правило, когда использовать знак амперсанда?

4b9b3361

Ответ 1

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

Вы найдете большинство из вышеперечисленных материалов на языке программирования C (второе издание) Брайана У. Кернигана и Денниса М. Ричи.

Ответ 2

Поскольку строки C имеют тип char []. Имя массива имеет значение этого адреса, но переменной int нет, вам нужно использовать &

И неправильно писать void main, вы всегда должны использовать int main.

Ответ 3

В C строки представляют собой массивы символов (завершаются символом \0).

Имя массива возвращает указатель на первый элемент массива (ячейка памяти, где хранится массив), а имя скалярной переменной возвращает значение скаляра, поэтому вам нужно использовать оператор & для получения памяти местоположение скаляра, в котором вам нужно записать значение.