指针变量
基本概念和用法
简单的理解就是内存中的一块区域,它存放的不是变量,而是另一个变量在内存中的地址,申明指针变量的语法:类型说明符* 变量名称
#include <iostream>
using::std::cout;
using::std::endl;;
/**d
* 通过指针变量来访问数据
* */
int main(){
//定义一个int类型的变量
int int_A = 10;
//常规方式访问输出
cout << int_A << endl;
//输出int_A在内存的地址
cout << &int_A << endl;
//定义一个int类型的指针
int* p_int_A = &int_A;
//直接打印p_int_A的值 因为它保存的就是变量int_A的地址 所以控制台输出应该跟&int_A的值是相同的
cout << "p_int_A=" << p_int_A << endl;
//解引用操作 *p_int_A 表示打印p_int_A指针指向变量的值 即int_A的值10
cout << "*p_int_A=" <<*p_int_A << endl;
//打印p_int_A自身在内存中的地址
cout << "&p_int_A=" <<&p_int_A << endl;
return 0;
}
打印:
10
0x7ffdd0ccdc9c
p_int_A=0x7ffdd0ccdc9c
*p_int_A=10
&p_int_A=0x7ffdd0ccdca0
使用const修饰指针
#include <iostream>
using::std::cout;
using::std::endl;;
/**
* 使用const修饰指针
* */
int main(){
//定义一个int类型的变量
int int_A = 10;
int int_B = 20;
//const修饰指针,常量指针
//特点是指针的指向可以修改,但指针指向的值不能修改
const int* p1 = &int_A;
cout << *p1 << endl; //console:10
//修改int* p1的指向 console:20
p1 = &int_B;
cout << *p1 << endl;
//修改int* p1指向的值 编译报错:必须为可修改的左值
//*p1 = 30;
//const修饰常量,指针常量
//特点是指针的指向不能修改,但指针指向的值可以修改
int* const p2 = &int_A;
//修改p2的指向 编译报错:必须为可修改的左值
//p2 = &int_B;
//修改p2指针指向的值
*p2 = 60;
cout << *p2 << endl;//console:60
//const即修饰指针,又修饰常量
//特点指针的指针的指向和指向的值都不能修改
const int* const p3 = &int_A;
//修改p3的指向 编译报错:必须为可修改的左值
//p3 = &int_B;
//修改p3指向的值 编译报错:必须为可修改的左值
//*p3 = 60;
//申明一个const的int类型的变量
const int c_int_C = 30;
//申明一个常量指针指向c_int_C
//可行 因为不能通过p4修改c_int_C的值
const int* p4 = & c_int_C;
//申明一个非const指针
//编译器报错 因为c_int_C为const变量 如果非const指针能指向它就能修改的值,是荒谬的
//int *p5 = & c_int_C;
return 0;
}
指针的危险
在使用指针过程中一定要牢记在申明指针的时候一定要将指针指向一个确切的地址
int main(){
//定义一个int类型的变量
//申明了一个指针,但是没给它初始值,它可能指向系统中的任何一个内存地址,如果该内存地址存储的是系统关键代码值那我们对其指针指向的值进行修改可能会导致莫名bug,而且这种bug是很难被发现的
int *int_A;
*int_A = 10;
return 0;
}
指针和new关键字
通常情况下我们在程序中申明变量,编译器在编译时就会为申明的变量分配内存地址,我们可以使用new关键字,在程序运行期间分配未命名的内存空间,并通过指针去访问它。
数组和指针
#include <iostream>
using::std::cout;
using::std::endl;;
/**
* 指针和数组
* */
int main(){
//定义一个int类型的数组
int array[]={1,2,3,4};
//直接输出array
cout << "array:" << array << endl; //console:array:0x7fff37250310
//定义一个int类型的指针
int* p = array;
cout << "p:" << p << endl; //console:p:0x7fff37250310
//输出数组中第一个元素的地址
cout << "array[0]:" << &array[0] << endl; //console:array[0]:0x7ffc4e328790
//上述代码表明 数组名解释为数组中第一个元素的地址
//定义一个指针指向数组中第一个元素的地址
int* p1 = &array[0];
//两个指针分别加一
p = p+1;
p1 = p1+1;
cout << "p:" << p << "*p:" << *p << endl; //console:p:0x7fffb8243214*p:2
cout << "p1:" << p1 << "*p1:" << *p1 << endl; //console:p1:0x7fffb8243214*p1:2
cout << array[0] << array[1] << endl;
cout << *array << *(array+1) << endl;
//以上案例表明数组名就是数组中第一个元素的地址
return 0;
}