c++ - C++ 指针和地址
问题描述
我只是在玩指针作为函数参数,我知道这一点。
#include <iostream>
using namespace std;
void func(int *a)
{
*a+=1;
return;
}
int main()
{
int a=1;
cout<<a<<endl;//prints 1
func(&a);
cout<<a;//prints 2
return 0;
}
我的问题是为什么下面的代码与上面的代码类似,更准确地说
当我们在上述情况下从主函数调用 func(&a)
// 这 4 个字节(int 大小)的数据的起始地址被传递,在我们的函数(func)中,这个地址存储在本地指针 'a' 中,当我们写 *(a) 时,我们的编译器知道读取 4 个字节data 因为它是一个整数指针。
简而言之,我的问题是
当我们调用 func(a) 时,我们传递给 'func' 到底是什么,其中 'a' 是一个存储整数值的变量,而 func(int &a) 到底是什么意思
#include <iostream>
using namespace std;
void func(int &a)
{
//cout<<*a;// error
a+=1;
// cout<<a<<endl;
}
int main()
{
int a=1;
cout<<a<<endl;// prints 1
func(a);
cout<<a;// prints 2
return 0;
}
抱歉英语不好
解决方案
这两种情况的工作方式类似:
情况 1:func
需要一些指向整数 ( int *a
) 方向的指针,如您所说,sizeof (int)
根据操作系统,它是字节块的第一个字节。当调用 func 时,您正确地传递了该方向func(&a)
,因此编译器认为该调用类似于:int p = &a; func(p);
无论如何,指向该方向的指针实际上就是传递的内容。
情况 2:func 期望某个整数 ( int &a
) 的某个方向。当调用 func 时,您只是正确传递了 value func(a)
,因为所有 C++ 编译器都支持引用参数,编译器在内部传递传递值的方向,func (&a)
. 请注意,如果您尝试像调用 func 一样调用func (&a)
会发生错误,因为它会func (&&a)
在编译器等待 ( &a
) 时传递一些东西。
OBS:我们也可以将第二种情况void func(int &a)
作为参考,它不同于带有示例的指针:
int a = 10;
int &b = a;
cout<<a; //10 is printed
cout<<b; //10 is printed
b = 20;
cout<<a; //20 is printed
cout<<b; //20 is printed
无论您修改对a
(ie b
) 的引用还是a
直接修改,您都在修改相同的值,因为它们与 a 的方向相同。
推荐阅读
- flutter - 使用 sqflite 将列表存储在 Blob 中
- swift - 按commentDate 对自定义字典进行排序
- flutter - Flutter 应用程序未在我的 Android 真实设备中运行
- sql-server - AVL 跟踪系统数据库
- php - 尝试计算导入的 Excel 文件的行数时出现错误“返回值必须是 int 类型,返回数组”
- linux - 如何 GREP 文件名的子字符串以重命名文件?
- angular - 我可以在没有任何 React、Angular 和 Blaze 的情况下使用 Meteor.js 吗?我想使用我自己的图书馆
- puppeteer - 使用 Apify Puppeteer Scraper 访问和循环外部数据源
- java - 为什么我从java中的除法中得到不好的结果
- android - 无法在 Android Studio 中生成 SIGNEDD APK