Ответ 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
.
Использование указателей:
если вы используете указатели, как показано ниже, то вы узнаете, как увеличить указатель и получить значения в разных местах массива.
Вы можете перемещать указатель местоположения для чтения массивов. Вы можете читать массивы без перемещения указателя.
Чтение массивов путем перемещения местоположения указателя
#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 } }
Чтение массивов без расположения движущихся указателей.
#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 (второе издание) Брайана У. Кернигана и Денниса М. Ричи.