发布于:2021-01-28 13:40:31
0
159
0
什么是指针?
在C++中,指针是指保存另一变量地址的变量。与正则变量一样,指针也有数据类型。例如,整型指针可以保存整型变量的地址。字符型指针可以保存字符型变量的地址。
您应该将指针视为内存地址的符号表示。通过指针,程序可以通过引用模拟调用。它们还可以创建和操作动态数据结构。在C++中,指针变量是指指向另一变量指向的内存中的特定地址的变量。
C++中的地址
为了理解C++指针,必须了解计算机如何存储数据。
当你在C++程序中创建变量时,它会给计算机内存分配一些空间。此变量的值存储在指定的位置。
为了知道数据存储在计算机内存中的位置,C ++提供了&(引用)运算符。操作员返回变量占用的地址。
例如,如果x是变量,&x返回变量的地址。
指针声明语法
C++声明采用以下语法:
datatype *variable_name;
数据类型是指针的基本类型,必须是有效的C ++数据类型。
variable_name是指针变量的名称。
上面用于指针声明的星号类似于用于执行乘法运算的星号。星号将变量标记为指针。
这是C++中有效指针声明的一个例子:
int *x; // a pointer to integer
double *x; // a pointer to double
float *x; // a pointer to float
char *ch // a pointer to a character
引用运算符(&;)返回变量的地址。
解引用运算符(*)帮助我们获取存储在内存地址中的值。
例如:
如果我们有一个名为num的变量,存储在地址0x234中,并存储值28。
引用运算符(&;)将返回0x234。
解引用运算符(*)将返回5。
#include <iostream>
int main() {
int x = 27;
int *ip;
ip = &x;
cout << "Value of x is : ";
cout << x << endl;
cout << "Value of ip is : ";
cout << ip<< endl;
cout << "Value of *ip is : ";
cout << *ip << endl;
return 0;
}
输出:
工作原理:
以下是代码截图:
代码说明:
导入iostream头文件。这将允许我们使用头文件中定义的函数而不会出错。
包含std名称空间以使用其类而不调用它。
调用main()函数。程序逻辑应添加在此函数体中。{标记函数体的开始。
声明一个整数变量x并将其赋值为27。
声明指针变量*ip。
将变量x的地址存储在指针变量中。
在控制台上打印一些文本。
在屏幕上打印变量x的值。
在控制台上打印一些文本。
打印变量x的地址。地址值存储在变量ip中。
在控制台上打印一些文本。
打印存储在指针地址的值。
程序成功执行后应返回值。
main()函数主体的结尾。
数组和指针基于相关概念工作。在使用具有指针的数组时,需要注意的事情不尽相同。数组名称本身表示数组的基址。这意味着要将数组地址分配给指针,不应使用与号(&;)。
例如:
p = arr;
以上是正确的,因为arr表示数组的地址。下面是另一个例子:
p = &arr;
以上不正确。
我们可以隐式地将数组转换为指针。例如:
int arr [20];
int * ip;
以下是有效操作:
ip = arr;
在上述声明之后,ip和arr将是等价的,并且它们将共享属性。但是,可以将不同的地址分配给ip,但我们不能将任何内容分配给arr
此示例演示如何使用指针遍历数组:
#include <iostream>
int main() {
int *ip;
int arr[] = { 10, 34, 13, 76, 5, 46 };
ip = arr;
for (int x = 0; x < 6; x++) {
cout << *ip << endl;
ip++;
}
return 0;
}
输出:
以下是代码截图:
代码说明:
声明整数指针变量ip。
声明一个名为arr的数组,并在其中存储6个整数。
将arr分配给ip。ip和arr将变得等效。
创建for循环。创建循环变量x是为了迭代索引0到5的数组元素。
打印存储在指针IP地址的值。每次迭代将返回一个值,总共重复6次。Endl是一个C++的关键字,它是结束线。此操作允许您在打印每个值后将光标移动到下一行。每个值将打印在一行中。
在每次迭代后将指针移动到下一个int位置。
循环结束。
程序必须在成功执行时返回某些内容。
main()函数体的结尾。
如果没有要分配的确切地址,则可以为指针变量分配NULL。应该在申报的时候做。这种指针称为空指针。它的值为零,并且在许多标准库(如iostream)中定义。
#include <iostream>
int main() {
int *ip = NULL;
cout << "Value of ip is: " << ip;
return 0;
}
输出:
以下是代码截图:
代码说明:
声明指针变量ip并为其赋值NULL。
在控制台上打印指针变量ip的值和一些文本。
程序成功完成后必须返回值。
main()函数主体的结尾。
C++,可以直接从计算机的内存中操作数据。
可以根据需要分配或重新分配存储空间。这是通过指针变量实现的。
指针变量指向计算机内存中由另一个变量指向的特定地址。
可声明如下:
int *p;
或者
int* p;
在you示例中,我们声明了指针变量p
它将保存一个内存地址。
星号是解引用运算符,表示指向的指针。
指针p指向内存地址中的整数值。
#include <iostream>
int main() {
int *p, x = 30;
p = &x;
cout << "Value of x is: " << *p;
return 0;
}
输出:
以下是代码截图:
代码说明:
声明一个指针变量p和一个值为30的变量x。
将变量x的地址指定给p。
在控制台上打印指针变量p的值和一些文本。
程序成功完成后必须返回值。
main()函数主体的结尾。
<> C++中的函数只能返回一个值。此外,函数中声明的所有变量都在函数调用堆栈中分配。一旦函数返回,所有堆栈变量都将被销毁。
函数的参数是通过值传递的,对变量所做的任何修改都不会改变传递的实际变量的值。下面的例子有助于说明这一点概念:-
例5:
#includeusing namespace std;
void test(int*, int*);
int main() {
int a = 5, b = 5;
cout << "Before changing:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
test(&a, &b);
cout << "nAfter changing" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
void test(int* n1, int* n2) {
*n1 = 10;
*n2 = 11;
}
输出:
以下是代码截图:
代码说明:
创建一个名为test的函数原型,该函数将接受两个整数参数。
调用main()函数。我们将在其主体中添加程序逻辑。
声明两个整型变量a和b,每个变量的值为5。
在控制台上打印一些文本。endl(结束行)将移动光标开始下一行的打印。
在控制台上将变量a的值与其他文本一起打印。endl(结束行)将移动光标开始下一行的打印。
在控制台上打印变量b的值和其他文本。endl(结束行)将移动光标开始下一行的打印。
创建一个名为test()的函数,将变量a和b的地址作为参数。
在控制台上打印一些文本。在打印文本之前,| n将创建一个新的空行。文本打印后,endl(结束行)将移动光标开始下一行的打印。
在控制台上将变量a的值与其他文本一起打印。endl(结束行)将移动光标开始下一行的打印。
在控制台上打印变量b的值和其他文本。endl(结束行)将移动光标开始下一行的打印。
程序成功完成后必须返回值。
main()函数主体的结尾。
定义函数test()。函数应该采用两个整数指针变量*n1和*n2。
将指针变量*n1赋值为10。
将指针变量*n2赋值为11。
函数测试()正文结束。
即使在函数测试中为变量a和b分配了新的值,但一旦函数调用完成,外部函数main也不会反映出相同的值。
使用指针作为函数参数有助于在函数中传递变量的实际地址,对变量执行的所有更改都将反映在外部函数中。
在上述情况下,函数“test”具有变量“a”和“b”的地址。这两个变量可以从函数“test”直接访问,因此对这些变量所做的任何更改都会反映在调用方函数“main”中
下面是使用指针的优点/好处
指针是存储C++中其他变量地址的变量。
函数可以使用指针修改和返回多个变量。
可以使用指针动态分配和取消分配内存。
指针有助于简化程序的复杂性。
使用指针可以提高程序的执行速度。
指针是指保存另一个变量地址的变量。
每个指针都有一个有效的数据类型。
指针是内存地址的符号表示。
指针允许程序模拟引用调用,并创建和操作动态数据结构。
数组和指针使用相关概念。
数组名称表示数组的基。
如果要将数组地址分配给指针,请不要使用与号(&;)。
如果没有指定的地址来指定指针变量,请将其指定为NULL。
作者介绍