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是reference

inta
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