1.6 c++_指针

来源:互联网 发布:最有名的网络武侠小说 编辑:程序博客网 时间:2024/06/05 03:19

1,生命和初始化
2,指针的危险
3,关键字new和delete
4,指针算术
5,小结

初始化指针:

*被用作指针
*两边的空格是可选的,空格有或者没有无所谓

int * test1;//这表明,*test1的类型是int型,test1变量本身是指针(地址);test1指向int类型、test1也是指向int型的指针。int test2 = 5int* test3 = &test2;//通过前缀的&符号来获得类型的指针地址cout << "指针指向的值:" << *test3;cout << "指针地址:" << test3;

指针的危险:

1,指针必须有初始化操作
即:int* test1 = & test2;
如果出现:int * test1; *test1 = 12//如果忽略了后面一句,则没有初始化;
不初始化的后果是会导致一些最隐匿、最难调试的bug

直接赋值指针以地址:
直接将一个内存地址赋值给指针:
int* test1;
test1 = 0xB8000000;

这么做是错误的,c++的编译器是不通过的,c语言在c99标准发布之前允许这么做。

如果要这么做,必须强转:
int* test1;
test1 = (int *) 0xB8000000;

使用new来分配内存

new关键字必须和delete关键字成对出现

int* test1 = new int;*test1 = 12;cout << "指针的值:" << *test1 << endl;//使用完指针后要使用delete来清除内存delete test1;

使用new来创建动态数组:

int* tests = new int [10];tests[0] = 10;tests[1] = 11;tests[2] = 12;cout << "指针数组test[0]的值:" << tests[0] << endl;tests += 1;cout << "因为指针是变量,所以可以使用test += 1的方式来让指针指向的值往后移一位,指向下一个元素的地址。tests[1]和原来未移动之前test[0]的值相同:" << tests[1] << endl;delete [] tests;

指针算术

int testInts[3] = {1,2,3};int* testInt1 = testInts;int* testInt2 = &testInts[0];int (*testNewInts)[4] = &testInts;//如果没有括号,则testNewInts会先和[4]结合,导致testNewInt是一个int指针数组,包含四个元素。因此,括号必不可少;这行代码的愿意是创建一个数组,数组中保存了四个内存地址//通过程序输出可以看出,testInt1对应的是testInts内存地址,而*testInt1对应的是testInts的第一个值,对数组取地址的时候,数组名被解释为第一个元素的地址cout << "testInt1的值:" << testInt1 << "testInt1的指针地址:" << *testInt1 << endl;testInt1 += 1;//testInt1 +1 后,通过程序输出可以看出,testInt1对应的还是testInts内存地址,而*testInt1对应的是testInts的第二个值了,数组指针本身加减是影响指针指向的元素cout << "testInt1的值:" << testInt1 << "testInt1的指针地址:" << *testInt1 << endl;//通过程序输出可以看出,testInt2对应的是testInts[0]的内存地址,而*testInt2对应的是testInts[0]的第值cout << "testInt2的内存地址:" << testInt2 << "testInt2的值:" << *testInt2<< endl;testInt2 += 1;//testInt2 +1 后,通过程序输出可以看出,testInt2对应的还是testInts[1]内存地址,而*testInt2对应的是testInts的第二个值了,指针本身加减也是影响指针指向的元素cout << "testInt2的值:" << testInt2 << "testInt2的指针地址:" << *testInt2 << endl;//testInts的指针,默认指向第一个元素的值,如果想指向指定的元素的值,则是后面一种写法cout << "*testInts指向的值:" << *testInts << endl;cout << "通过指针获得指定位置元素的值的写法:" << *(testInts + 1) << endl;cout << "对于指针来说,sizeof得到的不是数组的长度,而是指针的长度,即使指针指向的是一个数组:" << sizeof(testInt1) << endl;

指针小结

1,声明指针
int * testInt;

2,给指针赋值
int * testInt;
int testInt1 = 12;
testInt = &testInt1;

char * testChar;
testChar = new Char;

double * testDouble;
testDouble =new double[30];

3,对指针解除引用
delete testChar;

delete[] testDouble;

4,指针和指针指向的值的区别
int * pt = new int;
*pt = 5;
pt 是指向int的指针,*pt是一个int型的变量

5,数组名
int ints [10];
c++将数组名作为数组第一个元素的地址

ints表示的意思是数组ints的第一个元素的地址

6,指针算术
c++允许指针和正数相加减。
+1相当于原来的地址值加上指向的对象占用的总字节数。
将一个指针减去另一个指针,获得两个指针的差,得到一个正数,仅当两个指针指向同一个数组的时候。

int ints[10] = {1,2,3,4,5,6,7,8,9,2};
int* pt = ints;//因为数组名表示第一个元素的内存地址,所以pt这里代表的就是第一个元素的指针
pt += 1;//这个+1的操作是将指针的位数移向后面一个元素,即开始pt表示1的内存地址,+1后表示2的内存地址
int * pe = &ints[9];//pe表示数组ints的第十个元素的内存地址
pe -= 1;//和pt+1的效果一样,会从2变成9的内存地址
int diff = pe -pt;//相当于2-2;

7,数组的动态联编和静态联编
使用数组声明来创建数组的时候是静态联编,即数组的长度在编译的时候已经设置
int ints[20];//在编译的时候已经设置了长度为20

使用 new[] 运算符创建数组的时候是动态联编,即将在运行的时候为数组分配空间,长度也是在运行时设置id,使用完以后应该使用delete []来释放内存。

int * ints = new int[];
delete [] ints;

8,数组表示法和指针表示法
使用方括号数组表示法 = 对指针接触引用
ints[0] = *ints
ints[3] = *(ints + 3);

原创粉丝点击