我什么时候应该在 scanf() 中使用 & 符号

2024-01-18

在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 我不需要使用 & 符号,而 forint我必须使用它吗?

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


scanf 将特定类型的数据读取到作为第二个、第三个、第四个等参数传递的地址中。

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

Here var是值并且&var是地址。上面的声明说:读%d(整数)数据类型&var地址。

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

Here 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 编程语言》(第二版),作者:Brian W. Kernighan 和 Dennis M. Ritchie https://stackoverflow.com/tags/c/info.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候应该在 scanf() 中使用 & 符号 的相关文章

  • 为什么 GetThreadTimes 返回

    我试图测量线程中花费的时间以用于进度报告目的 但我从 GetThreadTimes 系统调用中得到非常奇怪的结果 给出以下程序 在 VS 2013 中编译 针对 NET 4 5 using System using System Diagn
  • Android:比 android:ellipsize="end" 更好的东西可以将“...”添加到截断的长字符串中?

    这个性质 https stackoverflow com questions 1666736 android textview automatically truncate and replace last 3 char of string
  • 如何从二维字节数组创建图像?

    在我的项目中 经过长时间的处理 我从红外摄像头获得了一个二维字节数组 字节数组中保存图像 如何在 C 中将该字节数组转换为图像 我知道通过 MemoryStream ms new MemoryStream byteArray System
  • 为什么 SqlClient 在传递 SqlXml 时使用不必要的 XML 转换?

    我有一个关于从 C 代码将 xml 数据类型传递给查询的问题 首先 这是 SQL Server 上的一个表 CREATE TABLE dbo XmlTable id int IDENTITY 1 1 NOT NULL dat xml NOT
  • 网络驱动器在启动时不可用

    我有一个 C 应用程序 它在启动时加载 并将数据记录到网络驱动器 该驱动器安装为 X 当机器首次启动时 应用程序会抛出 X 不可用的错误 如果我重新启动应用程序 也会出现同样的错误 但是 如果我打开 Windows 资源管理器并双击浏览驱动
  • 输出字段值相同的记录

    该主题可能会重复 我在不同的场景下询问这个话题 https stackoverflow com questions 64150691 select records which the values of the field are the
  • 多次重定义错误

    在了解了有关类和指针的更多信息后 我重构了一个程序并删除了超过 200 行代码 在此过程中创建了另外两个类 Location and Piece 问题是 在编译完所有内容后 链接器抱怨构造函数Piece被定义了多次 有很多错误 In fun
  • 如何使用 iText7 将 .p7s 字节数组插入 PDF 中?

    我正在尝试将 p7s 字节数组信息插入签名字段 我按照下面的图片操作 我的步骤 准备签名容器 原始PDF是 tmp example pdf 这部分的输出是 results prepared pdf PdfSigner signer new
  • 如何唤醒正在休眠的线程?

    我在加载事件中创建了一个线程 如下所示 Thread checkAlert null bool isStop false private void frmMain Load object sender EventArgs e checkAl
  • 使用 Thread.Sleep 等待的替代方法

    首先我不是在问同样的问题C Thread Sleep 的替代方案 https stackoverflow com questions 5450353 c sharp alternative to thread sleep or C 中 Th
  • 如何使这些 std::function 参数明确?

    传递 lambda 时 以下函数重载是不明确的 我发现std function can be 由大多数可调用类型构造 https stackoverflow com a 22543082 1079110 即使他们的签名不匹配 所以编译器无法
  • 如何使用 google test for C++ 来运行数据组合

    我有一个单元测试 需要针对 200 种可能的数据组合运行 生产实现在配置文件中有要测试的数据 我知道如何模拟这些值 我更喜欢为每个组合编写单独的测试用例 并使用某种方式循环数据 有没有使用 Google test for C 的直接方法 您
  • C# 代码自动授予 IIS 对 Windows Server 2008 上文件夹的写入权限?目前抛出异常

    我正在尝试编写一个命令行工具 该工具将为 Windows Server 2008 上的 IIS7 5 提供对 wwwroot 中文件夹的写入权限 以便 Web 应用程序有权写入其基本目录中的特定文件夹 以前 您可以通过在文件夹上分配 IIS
  • 如何重新解释或转换具有已知内存布局的对象而不出现未定义的行为

    我有一个矩阵类transposedView 我多年来一直使用该方法作为行向量和列向量之间的 零开销 转换 template
  • 如何在C#中从XML读取键值

    我有下面的 xml 格式文件 名为 ResourceData xml
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 委托给子组件的模式

    在我正在工作的产品中 非常基本的场景之一是类的序列化 通常 要序列化的类会在其子组件上调用序列化 例如如果有一个类 s t 班级 A B C D 那么A Pack会调用pack B C D 上的函数 由于有很多这样的类 因此必须一遍又一遍地
  • IEnumerable 的随机顺序

    我有一个 IEnumerable 集合如下 var result1 GetResult1 Returns 2 4 5 6 我必须处理元素并以随机方式创建另一个集合 结果应如下 var result2 GetResult2 result1 R
  • 进度条没有进展

    我有一个正在更新 sqlserver 中的表的程序 我有一个表单 我想显示其进度 进度条正在递增 但没有显示 我需要为此使用后台工作者吗 我正在做什么的例子 public void updateTable string tableName
  • 良好的类似 STL 的 C 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于具有向量 双端队列 堆栈 哈希图 树形图 集合等数据结构的 C 语言来说 有哪些好的库 请使用纯 C 并且与平台无关 The Glib

随机推荐

  • 求值器中的表达式非法(&访问冲突)

    我试图通过使用类 Tbb2uc 来处理纯文本文件 加载到 StringList 中 但在调用函数 GetAddress 时获取 AV TArrayQuotePositions array 1 4 of integer Tbb2uc clas
  • 将 CSV 直接下载到 Python CSV 解析器中

    我正在尝试从 Morningstar 下载 CSV 内容 然后解析其内容 如果我将 HTTP 内容直接注入 Python 的 CSV 解析器 结果的格式不正确 然而 如果我将 HTTP 内容保存到文件 tmp tmp csv 然后将该文件导
  • 如何从 MailItem 获取特定于任务的属性

    我一直在为自己做一个周末小项目 其中包括从 Outlook 获取所有 ToDo 任务 将它们放入 DataGridView 中 然后我就能够编辑和导出它们 我遇到的唯一问题是 当标记的电子邮件仍然存在时 我无法获取它们的任务特定属性 我只是
  • 声明 std::string 变量后,Cout 没有输出

    我编写了一个简单的程序 返回作为参数传递的 IP 地址的主机名 该程序使用两个函数 getaddrinfo 和 getnameinfo 我正在使用 Linux Mint Netbeans IDE 和 G 编译器 输出没问题 没有错误 但是当
  • 阿拉伯字符“??????”关于 php 和 mysql [重复]

    这个问题在这里已经有答案了 这是我的问题 我有一个阿拉伯数据库 mysqli UTF8 general ci 并且我的 php 文件的字符集是 UTF 8 当我出售数据时 我得到 在 php 上 我的管理员我可以毫无问题地写入和读取 在 p
  • Django 模型主键作为一对

    我正在尝试制作一个应用程序 用户可以登录他们的个人资料并将歌曲添加到他们最喜欢的列表中 我为此定义了 M2M 关系 我的问题是如何说 歌曲 歌手 的组合是独特的 我搜索了一下 发现通过unique together也许可以 这是设置的正确方
  • 使用 LEFT JOIN 删除

    我想根据引用第一个表的另一个表中存在的数据从表中删除 但是 当我将其作为 SELECT stetement 运行时 我有有效的代码并显示要删除的值 但是当我将其更改为删除它给了我错误 我不明白它们为什么在那里 DELETE leadCust
  • 如何使用facet_wrap在每个方面具有不同数字的离散类别之间创建相等的距离

    我的目标是使图中所有国家之间的距离大致相等 例如 在第一类中 Increase 国家分散 另一方面 第二类和第三类国家彼此距离太近 这迫使我减小国家文本的大小 例如 IS UK 和绘制的估计值 例如 1 5 1 2 因此 一旦我将此文件提取
  • GCE Kubernetes 会话持久化

    我正在 GCE Kubernetes 上运行一个 wordpress woocommerce 网站 但由于会话持久性而在扩展时遇到问题 LoadBalancer GCE Ingress 将所有流量发送到反向代理 然后反向代理将流量发送到我设
  • 在 Scala 中将列表[Try[A]] 转换为列表[A]

    我想从输入数据中过滤掉错误的输入 我目前正在使用scala util Try包装任何异常 下面是一个简单的例子 其中 3I 抛出一个NumberFormatException 我想知道在 Scala 中是否有更好的方法来做到这一点 val
  • OpenGL 和 QtQuick 纹理问题

    我正在基于 Qt 附带的 openglunderqml 示例在 C 中开发一个简单的 QQuickItem 实现 我做了一些修改以使用不同的着色器和加载的两个纹理 这个想法是着色器将在两个纹理之间交叉淡入淡出 本质上只是我加载到纹理中的图像
  • Flutter Web:堆栈和耀斑问题

    我试图在 Flutter Web 开发频道 v1 13 2 上创建一个简单的网页 但出现了这个奇怪的问题 当我尝试在堆栈小部件中放置耀斑动画时 该堆栈小部件分别有 2 个附加小部件 一个背景和一个居中文本 耀斑似乎没有出现 但是当我移除背景
  • 如何将 8 个打包的 32 位整数(在 __m256i 中)的 +-1 符号打包为 64 位整数的字节?

    给定一个 m256i打包 32 位有符号整数的价值 如何获取每个字节所在的单个 64 位数字1如果原始的相应 32 位有符号整数 m256i大于或等于0 并得到 1如果该 32 位整数是负数 AVX2 可能还有 AVX512 很有趣 这是另
  • Jenkins 要求接受 TFS EULA

    我在 Jenkins 上创建了一个附加到 TFS 服务器的构建作业 我使用 Team Explorer Everywhere 来促进这一点 我第一次运行该作业时 收到以下消息 Error You must accept the End Us
  • 如何使用 Express.js 指定 HTTP 错误代码?

    我努力了 app get function req res next var e new Error error message e status 400 next e and app get function req res next r
  • FIND_IN_SET 有两个字符串

    我有这个员工列表的员工表 ID EMPLOYEE ID SKILLS 1 1 3 4 2 2 3 5 2 3 3 1 5 和列
  • ARC Welder 打包的 Android 应用程序只能在 Chrome 操作系统上使用吗?

    如果我使用 Google ARC Welder 打包 Android 应用程序并通过 Chrome 网上应用店分发它 它是否适用于 Windows Mac Linux 还是仅适用于 Chrome 操作系统 如果是这样 有什么消息表明这种情况
  • 使用 openssl C 进行 AES(aes-cbc-128、aes-cbc-192、aes-cbc-256)加密/解密

    我只想用这 3 种模式测试 openSSL 的 AES 密钥长度为 128 192 和 256 但我的解密文本与我的输入不同 我不知道为什么 另外 当我传递一个巨大的输入长度 比方说 1024 字节 时 我的程序显示core dumped
  • 如何在张量流中实现多元线性随机梯度下降算法?

    我从单变量线性梯度下降的简单实现开始 但不知道将其扩展到多元随机梯度下降算法 单变量线性回归 import tensorflow as tf import numpy as np create random data x data np r
  • 我什么时候应该在 scanf() 中使用 & 符号

    在c中使用 符号时使用的规则是什么scanf struct Student char name 20 int id int main void struct Student std1 printf enter name and id of