文章目录
C++ 指针
指针是一个变量,其值为另一个变量的地址
(1)定义指针
type *var-name;
// 一个整型的指针
int *ip;
(2)使用指针
指针前加一个 * 代表解引用,来取指针所指向地址 的 变量的值
#include <iostream>
using namespace std;
int main ()
{
int a = 20; // 定义变量
int *ip; // 1、定义指针
ip = &var; // 在指针变量中存储 a 的地址
cout << "变量a的值: ";
cout << a << endl;
// 输出在指针变量中存储的地址
cout << "输出在指针变量中存储的地址: ";
cout << ip << endl;
// 2、使用指针,解引用
cout << "取得指针所指向地址 的 变量的值: ";
cout << *ip << endl;
return 0;
}
一、int* age 和 int *age,*号靠近数据类型,和靠近变量名,有什么区别:
在C和类似的编程语言中,int* age
和 int *age
都是声明一个指向整数(int)类型的指针变量,但它们在语法上稍微有些不同,涉及到指针变量的声明和解析时会有一些微妙的影响。
1. int* age
:
在这种写法中,int*
被视为一个整体,表示“指向整数的指针”。这个语法强调了变量 age
是一个指向整数的指针类型。你可以通过 age
指针来访问整数值。
int* age; // 声明一个指向整数的指针变量
int value = 25;
age = &value; // 将指针指向整数变量 value
2. int *age
:
在这种写法中,int
和 *age
被分开,这也是一种常见的写法。这个语法中,*age
被视为一个指针变量,指向一个整数。这种写法也能清楚地表示 age
是一个指向整数的指针变量。
int *age; // 声明一个指向整数的指针变量
int value = 30;
age = &value; // 将指针指向整数变量 value
总的来说,这两种写法在大多数情况下是等效的,但是在涉及多个变量声明时可能会有一些微妙的差异。例如:
int* age, height; // 这里 age 是指针,height 是整数变量,可能会产生误导
在这种情况下,为了避免歧义,建议使用以下写法:
int *age, height; // 明确地指示 age 是指针,height 是整数变量
无论你选择哪种写法,重要的是保持一致,并且在代码中使用明确的命名和注释来清楚地表达你的意图。
二、int& age 和 int &age,& 号靠近数据类型,和靠近变量名,有什么区别:
在C++中,int& age
和 int &age
都涉及到引用(reference)的声明,但它们在语法上有一些微妙的差异,涉及到引用变量的声明和使用时会产生一些影响。
1. int& age
:
在这种写法中,int&
被视为一个整体,表示“整数引用”。这个语法强调了变量 age
是一个整数引用。引用在声明时必须立即初始化为引用某个已经存在的整数变量。
int value = 25;
int& age = value; // 声明一个引用,将其引用到整数变量 value
在此例中,age
现在是 value
的引用,任何对 age
的更改实际上都会直接反映在 value
上。
2. int &age
:
在这种写法中,int
和 &age
被分开,&age
被视为一个引用变量,引用一个整数。这种写法也能清楚地表示 age
是一个整数引用。
int value = 30;
int &age = value; // 声明一个引用,将其引用到整数变量 value
这两种写法在大多数情况下是等效的,都声明了一个整数引用。然而,在涉及多个变量声明时,它们可能会稍微有些不同,类似于指针的情况。
int& age, height; // 这里 age 是引用,height 是整数变量,可能会产生误导
在这种情况下,为了避免歧义,建议使用以下写法:
int &age, height; // 明确地指示 age 是引用,height 是整数变量
无论你选择哪种写法,重要的是保持一致,并且在代码中使用明确的命名和注释来清楚地表达你的意图。同时要注意,在C++中,引用一旦初始化后不能再引用其他变量,因此在使用引用时要格外小心。
三、在C++中,&符号的用法:
1. 在变量前面使用&符号表示取变量的地址。例如:
c++int x = 10;
int *p = &x; // 取变量x的地址,将其赋值给指针p
在上面的代码中,变量x的地址被赋给了指针p。
2. 在函数参数列表中使用&符号表示引用。例如:
c++void func(int &ref) {
ref = 20; // 修改引用ref的值,相当于修改了传递给函数的实际参数
}
int main() {
int x = 10;
func(x); // 传递变量x的引用给函数
cout << x << endl; // 输出20,因为函数内部修改了引用ref的值,相当于修改了变量x的值
return 0;
}
在上面的代码中,函数func接受一个引用作为参数,通过修改引用的值,相当于修改了传递给函数的实际参数。
总之,&符号靠近数据类型和靠近变量名时的用法不同,需要根据具体的上下文来判断。
四、在C++中,* 符号的用法:
在C++中,*号也有两种不同的用法,一种是用在指针变量前面,表示该变量是一个指针,另一种是用在函数参数列表中,表示引用。
1. 在指针变量前面使用*号表示该变量是一个指针。例如:
c++int x = 10;
int *p = &x; // 取变量x的地址,将其赋值给指针p
在上面的代码中,变量p是一个指向int类型的指针。
2. 在函数参数列表中使用*号表示引用。例如:
c++void func(int *ptr) {
*ptr = 20; // 通过指针修改实际参数的值
}
int main() {
int x = 10;
func(&x); // 传递变量x的地址给函数
cout << x << endl; // 输出20,因为函数内部通过指针修改了实际参数的值
return 0;
}
在上面的代码中,函数func接受一个指向int类型的指针作为参数,通过指针修改了实际参数的值。
至于String& name和String& name的区别,实际上是语法错误。因为在C++中,标识符不能包含空格,所以String& name是无效的语法。正确的语法是String& name或者std::string& name,表示该变量是一个std::string类型的引用。