使用时在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