#include <iostream>
int main(){
/*
1.cpu在访问数据的时候,是根据变量的内存地址进行访问的,而非变量名.
2.指针是一个值为内存地址的变量,即指针变量中存放的是内存地址.
3.声明一个变量其实就是在给这个变量分配一块内存空间.
eg:
//声明一个int类型的变量a,实际上就是在内存中找一块适合存储int类型数据的空间,分配给变量a.
int a;
//声明一个int类型的指针变量,并把变量a的地址,作为值保存进系统给指针p分配的内存空间中.
int *p = &a;
4.指针变量的声明格式:
数据类型 指针变量名;
eg: double *b;
注意:
要求指针变量的类型,与其指向数据的类型一致是有原因的.
因为不同类型的数据在内存中所占字节不同,
例如int型占4个字节,double占8个字节,若用int类型的指针指向double类型的数据,会出乱子的.
5.由于系统默认char类型的指针变量是一个字符串,因此在打印其指针变量
指向的变量地址时,需要加上强制类型转换
eg:
char a = "A";
char* p = &a;
//第一句打印出的结果不会是内存地址
cout << p << endl;
//加了强制类型转换后,才会输出正确的地址.(void *)表示任意类型.
cout << (void *)p << endl;
6.星号的位置意义:
(1)int* p: *号紧挨着数据类型,此写法偏向于地址,即p就是一个地址变量.
(2)int *p: *号紧挨着变量,此写法偏向于值,即*p是一个整型的值.
7.空指针:
(1)我们在声明指针的时候,最可怕的就是不给指针赋值.因为如果不给指针赋值,它就会指向一个默认值.
(2)C++中对空指针的定义有两种方式:
1.使用nullptr:
int * p = nullptr;
2.直接赋值0:
int * p = 0;
8.(void *)类型指针:
(1)该类型指针为一种特殊的指针,它可以存放任意类型的数据地址,即可以指向任意的数据类型.
eg: double a = 5.20;
int *p = &a;
void *q = &a;
if( p==q ){
cout << "true" << endl;
}
结果为true,因为p和q指向的地址相同.
(2)但该类型指针不可以进行直接赋值.
eg: void *p;
*p = 1234;
这样写是错的,因为系统无法识别指针p的变量类型,所以无法直接给它赋值.智能通过&进行取地址赋值.
因为这一限制,导致它一般是用于与其他指针进行比较,进而判断该指针的数据类型.或者是当强制类型转换用.
9.指针变量的使用:
(1)对于指针变量的初始化赋值,只能是通过取地址符&操作.
eg: int a = 1;
int* p = &a;
不能直接是:int* p = 1;
(2)对于指针指向数据的修改,可以直接给值.
eg: int a = 1;
int* p = &a;
*p = 2;
此处可以通过指针变量修改变量a中的数据.
(3)运算符*用于返回指针指向的内存地址的值.
eg: int* p = 2;
*p = 1;
cout << p << endl;
此处p前加个*,表示返回指针p所指内存地址的值,也即存放的数字2.
单独的p,表示指针p所指向数据的内存地址,也即就是一个地址.
(4)注意了,指针只是一个存放地址的变量,它所占的内存空间极其有限.
*/
}
C++学习--初识指针
最新推荐文章于 2024-10-08 00:02:21 发布