1、指针学习
(1):*在指针中有两种用法
一是用于定义指针
int * iPtr;
二是用于可执行语句中的指针之前,为间接引用操作符;
int* iPtr;
int iCount=10;
iPtr=&iCount;//将地址赋值给存放地址的指针
cout<<*iPtr<<endl;//间接引用指针
运行结果为
18
观察如下代码:
#include<iostream>
using namespace std;
int main(void)
{
int icount = 18;
int*iPtr = &icount;
*iPtr=58;//相当于即使上边定义了icount的值为18
//但是由于给*iPtr赋值为58,所以覆盖了原来的18,相当于又定义了icount=58
cout<<icount<<endl;
cout<<iPtr<<endl;
cout<<&icount<<endl;//与iPtr的值相等
cout<<*iPtr<<endl;//与icount的值相等
cout<<&iPtr<<endl;//指针本身的地址(既二级指针)
}
运行结果为
58
0x70fe1c
0x70fe1c
58
0x70fe10
int count;
int* iPtr;
*iPtr=58;
指针定义时一定记得初始化 没有赋初始值的指针是一个随机地址。*iPtr是把58赋到内存中的随机位置,这样将改写另一存储位置的数值,甚至修改了栈中的函数返回值,计算机将死机或进入死循环。
将浮点类型指针赋值给整型类型指针会导致隐式类型转换
见如下代码
float f=34.5;
float* fPtr=&f;
int* iPtr=&f;//会导致
cout<<f<<endl;
cout<<fPtr<<endl;
cout<<iPtr<<endl;
cout<<*fPtr<<endl;
cout<<*iPtr<<endl;
*iPtr=*fPtr;
cout<<f<<endl;
cout<<*fPtr<<endl;
cout<<*iPtr<<endl;
运行结果为
34.5
0x0067:fdfc
0x0067:fdfc
34.5
1107951616
4.7644le-44
4.7644le-44
34
*iPtr=*fPtr时,由于iPtr是整型,故只会取整。
(2):指针与数组
数组名本身,没有方括号和下标,它实际上是地址,表示数组起始地址。
数组名就是数组第一个元素地址。
即
a=&a[0];
存在下列两条等价关系
a[i]=*(a+i)=iPtr[i]=*(iPtr+i)
下表操作是针对地址而不仅仅是针对数组名,所以iPtr[i]也表示第i个元素的值
&a[i]=a+i=iPtr+i=&iPtr[i]
2.编程规范
使用new函数之后在输出之前要用delete[]释放内存。
sum+=*iPtr;
iPtr++;
等效于
sum+=*iPtr++;