C++ 参考及;混淆部分(声明及其类型)的指针
我正在研究指针和参考部件,而且很难研究它们。 我想我现在理解了函数中引用和指针的一些简单用法,但是有些东西我不能完全理解 以下是一些变量声明:C++ 参考及;混淆部分(声明及其类型)的指针,c++,pointers,types,reference,C++,Pointers,Types,Reference,我正在研究指针和参考部件,而且很难研究它们。 我想我现在理解了函数中引用和指针的一些简单用法,但是有些东西我不能完全理解 以下是一些变量声明: int a = 1; float b = 2; int* p = &a; string s = "Hello"; vector<int*> values = {p}; 我不知道它们到底是什么类型的,但我自己试过了 &a : pointer to int &b : pointer float p : pointer
int a = 1;
float b = 2;
int* p = &a;
string s = "Hello";
vector<int*> values = {p};
我不知道它们到底是什么类型的,但我自己试过了
&a : pointer to int
&b : pointer float
p : pointer to int
&p : pointer to pointer to int
&s : pointer to string
&(s.at(1)) : pointer to string
values.at(0) : pointer to int
&(values.at(0)) : pointer to pointer to int
&values : pointer to pointer to int
还有一个问题>
编写以下变量声明:
a) 指向字符串的指针
b) 对浮点数的引用
c) 指向整数的指针数组。
d) 指向布尔的指针
e) 指向int的指针的引用
我的答案是:
a: string* s = "Hello"
b: float& f = g;
c: int n =1;
int*x =&n;
int arr[] = {*x};
d: bool y = true;
bool* x = &y;
bool** qq = &x;
e: int a = 1;
int* x = &a;
int& z = *x;
我不确定我的答案。请帮助解决这些容易混淆的部分。第1部分:
如果表达式e
的类型为T
,则&e
的类型为指向T的指针<代码>T*
考虑表达式<代码> s的类型(1)和<代码>值< /代码>更仔细。 第2部分: c:
int-arr[]
不是“指向int的指针数组”,而是“int数组”
T
的数组是T arr[]
;int*
的数组是int*arr[]
int n = 1;
int* arr[] = {&n};
e:int&z
不是“指向int
的指针的引用”,而是“指向int
”对
T
的引用是T&
;对int*
的引用是int*&
int a = 1;
int* x = &a;
int*& z = x;
如果您需要知道表达式的确切类型,并且可以使用Boost,那么它提供了一个很好的功能
#include <boost/type_index.hpp>
#include <iostream>
#include <string>
#include <vector>
#define TYPE(x) std::cout << "decltype(" << #x << ") == " << type_id_with_cvr<decltype(x)>().pretty_name() << std::endl
int main()
{
using boost::typeindex::type_id_with_cvr;
int a;
TYPE(a);
int * p = &a;
TYPE(p);
TYPE(&p);
std::vector<int*> values {p};
TYPE(values.at(0));
TYPE(&(values.at(0)));
TYPE(&values);
}
#包括
#包括
#包括
#包括
#定义类型(x)std::cout首先,std::string
是一个包含字符数组的复杂对象,但它肯定不是字符数组。而std::vector也是一个包含int数组的复杂对象
这意味着在第一部分,您的一些尝试是错误的:
&(s.at(1)) : pointer to string WRONG: pointer to char
values.at(0) : pointer to int OK
&(values.at(0)) : pointer to pointer to int OK
&values : pointer to pointer to int WRONG: pointer to `vector<int>`
必须首先创建字符串,然后创建指向该字符串的指针
string s = "hello"; OK std::string initialized from a const char *
string *ps = &s; OK pointer to std::string
c也是错误的int arr[]
声明了一个int数组。您必须编写:
int *arr[] = { x }; OK array of 1 pointers initialized from x which is a pointer to int
int *&z = x; OK ref to a pointer to int initialized as a ref to x
对于e,int&z=*x代码>声明对int的引用,并将其初始化为对a的引用。要获取指针的引用,必须写入:
int *arr[] = { x }; OK array of 1 pointers initialized from x which is a pointer to int
int *&z = x; OK ref to a pointer to int initialized as a ref to x
&(value.at(0)):指向int OK的指针
为什么&(values.at(0))是指针
指针是内存中包含地址的变量
指针有它的类型
unsigned long ip = 0xC0A80A01; // 192.168.10.1
unsigned char *p = (unsigned char *)&ip;
printf("%d.%d.%d.%d\n", p[3], p[2], p[1], p[0]);
// Result: 192.168.10.1
我认为这只是变量的地址
int a = 1;
int *p = &a;
&a is not a pointer
p is a pointer
是吗
和
int&refVar=a;
refVar是referenceinta代码>a
是一个int.int*pa
pa
是指向int的指针。现在当a
将存储一个整数值时,pa
将存储一个地址,因为指针只是地址。因此,pa=&a代码>即pa
存储a
的地址。注意:pa和&a
是相同的,即都是指向int的指针。您对c和e的回答是错误的int-arr[]
声明整数数组,而不是指向整数的指针数组,类似地,int&z
是对整数的引用,而不是对指针的引用。(而且string*s=“Hello”
不应该编译,您不能以这种方式初始化string*
)谢谢您的回答,非常有助于理解。
int a = 1;
int *p = &a;
&a is not a pointer
p is a pointer