C++中的指针1
如果声明指针的时候,没有确切的地址可以赋值,最好为这个指针赋为NULL,这样指针指向内存地址为0的地址,内存地址为0是不可被访问的,可以避免一些难以预料的错误。
一、代码中的基础符号
直接以一段代码为例子:
# include <iostream>
using namespace std;
int main(){
int value = 20;
int *ip; // 声明一个地址变量,加个*表示ip是一个地址变量,ip也就是我们说的指针变量
ip = &value; // 用&符号取得value这个变量的地址,然后赋这个地址给ip
*ip = 0; //将ip这个地址对应的值改为0,也会改变value的值
cout << "the value of ip:" << ip << endl;
cout << "the value of *ip:" << *ip << endl;
cout << "the value of value: " << value << endl;
return 0;
}
结果:
the value of ip:0x61fe14
the value of *ip:0
the value of value: 0
分析:
*符号代表从一个地址变量中取出这个地址对应的值,像这段代码中,ip这个变量对应了一个地址, *ip则表示从ip表示的这个地址中取出对应的值
&符号代表从一个变量中取出这个变量对应的地址,像这段代码中,ip = &value,就是将value这个变量的地址赋给ip这个变量,然后ip和value对应的地址就是共命运同呼吸了,也就是value的值改变了,从ip从取出来的*ip的值也会随着改变。
二、指针运算
一个地址代表一个字节(8bit),而像int类型的变量占4个字节,按理说一个int变量需要四个地址来存储啊?
答:这里的地址只会返回变量第一个字节的地址。
指针可以进行加减运算和比较运算,不过加减运算一定要考虑指针类型!
1、加法运算
假设ptr是一个指针变量,那么ptr++的结果和这个指针变量的类型有关
int* ptr;
ptr++就表示地址的数值+4,因为int类型占四个字节,一个地址代表一个字节;
ptr = ptr+4;这个就表示地址的数值+(4x4)=16,这里ptr为int类型的指针变量,所以+4代表指针ptr向后移4个int类型元素的大小
char* ptr;
ptr++就表示地址的数值+1,因为char类型只占一个字节;
2、减法运算
指针之间的减法运算可以计算两个指针之间的元素个数,而不是数值上的差。
int* ptr1 = 0x61fe10
int* ptr2 = 0x61fe18
ptr2-ptr1的结果是等于2的,并不是8,这个要注意,因为这两个指针都是int类型指针
那不同数据类型的指针进行减法运算会出现什么样的结果呢?-->会报错
test8.cpp: In function 'int main()':
test8.cpp:11:33: error: invalid operands of types 'double*' and 'int*' to binary 'operator-'
cout << "ptr2-ptr1=" << ptr2-ptr1 << endl;
3、比较运算
可以用==、!=、<、<=、>、>=等比较符号对指针进行比较