这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战
指针给我们学习 cpp 带来一些麻烦,因为在学习 cpp 之前我们很少接触到对于内存这块内容,大家都知道 cpp 之所以快也就是让我们 developer 可以自己操作内存,对于内存分配和释放的一部分工作需要我们在程序里去完成。
经过一段时间学习和接触,指针对于自己也不再那么陌生,所以今天也鼓起勇气分享一些关于指针
#include <iostream>
using namespace std;
int main()
{
int n = 5;
cout << n << endl;
system("pause>0");
return 0;
}
取址
我们用一个变量来存储数值 5,可以将 n 变量理解为一个容器,所谓容器就是对应内存的空间,既然变量对一个一块存放数据的内存空间,那么如何知道具体是那一块内存空间呢?其实每一块内存空间都有一个地址,变量 n 可以看成地址别名,那么 n 到底对应是那一块内存空间呢? &n 可以在变量前加一个 & 就可以读取变量对应内存空间了。
int* ptr = &n;
cout << ptr << endl;
取值
cout <<*ptr << endl;
赋值
int main()
{
int n = 5;
cout << &n << endl;
int* ptr = &n;
cout << ptr << endl;
*ptr = 10;
cout <<*ptr << endl;
cout << n << endl;
system("pause>0");
return 0;
}
这里 int* ptr* 中 int 类型并不是指针的类型,而是指针指向内存地址中存储数据的类型,如果修改 float n = 5 就会报错 “初始化”: 无法从“float *”转换为“int *” 。
int* ptr2;
*ptr2 = 7;
就会出现如下使用了未初始化的局部变量“ptr2”,也就是当我们创建一个指针时,系统并没有为其开辟一块内存空间,需要我们定义一个变量,然后将变量内存空间地址赋值给这个指针。
int v;
int* ptr2 = &v;
*ptr2 = 7;
cout << "v=" << v << endl;
void 指针
#include <iostream>
using namespace std;
void printNumber(int* numberPtr) {
cout << *numberPtr << endl;
}
int main()
{
int number = 5;
printNumber(&number);
system("pause>0");
return 0;
}
di
void printLetter(char* charPtr) {
cout << *charPtr << endl;
}
printLetter(&letter);
void print(void* ptr, char type)
{
switch (type)
{
case 'i'://handle int*
cout << *((int*)ptr) << endl; break;
case 'c'://handle char*
cout << *((char*)ptr) << endl; break;
default:
break;
}
}
print(&number, 'i');
print(&letter, 'c');
不过 void 指针存在一定潜在问题,compiler ,这个问题是无法在 compiler 期间进行编译。