使用scanf()
时在c中使用&符的规则是什么?
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
我必须使用它?
是否有关于何时使用&符号的规则?
答案 0 :(得分:23)
scanf将特定类型的数据读入地址,这些地址作为第二个,第三个,第四个等参数传递...
int var;
这里var是值,& var是地址
scanf("%d",&var);
以上陈述说==>将%d(整数)类型的数据读入& var address
char s[20];
这里的地址不是值。 因为这里是一个包租数组(我们称之为字符串)
数组名称本身表示其地址。 s ==& s [0] ,这两者都相同。
scanf("%s",s);
以上陈述说==>从%s开始将%s(字符数组)数据类型读入地址位置。
int a[20];
请参阅此代码
#include<stdio.h>
#define MAX 5
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.
}
}
在C中我们没有任何单一格式说明符一次扫描一组整数,就像在%s的帮助下扫描一组字符一样。
这里a =&amp; a [0];
您可以将单个整数值直接扫描到a指向的地址。
scanf("%d",a);
printf("a[0]=%d\n",a[0]);
如果输入10,则打印出[0] = 10。
指针的用法:
如果您使用如下所示的指针,那么您将会知道。如何递增指针并将值放入数组的不同位置。
您可以将指针位置移动到读取数组。 你可以读出没有移动指针位置的数组。
1.通过移动指针位置来读取数组
#include<stdio.h>
#define MAX 5
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
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
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
}
}
您将在下面的书中找到上述大部分内容。
答案 1 :(得分:6)
因为C字符串的类型为char []
。数组名称具有其地址的值,但int
变量没有,您需要使用&
写void main
是错误的,你应该总是使用int main
。
答案 2 :(得分:0)
在C中,字符串是字符数组(以\0
字符结尾)。
数组名称返回数组的第一个元素的指针(存储数组的内存位置),标量变量的名称返回标量的值,因此您需要使用&
运算符来获取标量的内存位置,您需要在其中写入值。