创建一个新的指针,首先要赋值,然后在用之前一定要申请地址。即
int *p = NULL; p = new int;
void指针 void *p 可以与任意指针类型相互赋值。
常量限定符const
1)指向常量的指针:const int *p = &x;
//可以修改指针指向的地址,但不能修改他指向的内容。
const int *p = &x;
int x = 12,y = 23;
//*p = y;//错误的表示方法
p = &y;//是对的。//可以修改x
2)常指针:int *const p = &x;
//指针指向的地址不能变,但是指向地址里的内容是可以变的。
int *const p = &x;
int x = 23,y = 12;
//p = &y;//是错的
*p = 76//对的
3)指向常量的常指针:const int * const p = &x;
指针本身不能变,指向地址的内容也不能变。
指针与数组
数组名可以看成一个指针,而且是一个常指针,指向数组的起始地址。
int *p,array[10];
p = array;//p与array是等价的,对指针p可以执行任何有关数组下标的操作。p[3]==array[3]。
*(p+k)
对于常规数据类型p+k代表的是指向目前p地址后第k个元素的指针。比如p1-p2代表返回p1值与p2值之间的元素个数。
动态分配数组长度
重点是申请地址和收回地址。
int *p , *p1;
p = new int;
p = new int [n];//申请一个动态数组
//int p[n];//错误的申请动态数组方法
delete p;//将收回p指向的地址空间;
delete [] p;//收回动态数组,将收回p作为数组首地址的数组的空间。
assert函数
assert(断言),若断言为假则在发出一个错误消息后程序会终止。比如:我们用来判断p = new int时,是否成功的申请到了空间:
#include<iostream>
#include<cassert>
using namespace std;
int main()
{
int *p;
p = new int;
assert(!p);//p != null
*p = 234;
cout<<*p<<endl;
return 0;
}
详细请看http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html
引用
int &y = x;此时x与y用的是同一个内存单元,即:y只是x的别名而已。一个变量只能作为某一个变量的别名。
int main(int argc,char* argv[])
主要是为了方便在命令行直接键入参数。
argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,argv[0]是程序的名字,命令行参数分别放在argv[1] 、argv[2]……中。
int main(int argc, char* argv[])
{
int i;
for (i = 0; i<argc; i++)
cout<<argv[i]<<endl;
// cin>>i;
return 0;
}
据说还可以notepad.exe example.txt (当前目录下)直接用记事本打开example.txt文件。以后再学http://www.cnblogs.com/avril/archive/2010/03/22/1691477.html
指向函数的指针
定义格式为 返回类型 (*函数名)(形式参数表)
int (*p)();//指向一个没有参数、返回值为int型的函数指针
double (*p)(int);//指向有一个整形参数、返回值为double型的函数指针
指针变量外的圆括号不能省略。直接上例子
#include<iostream>
using namespace std;
void one();
void two();
void three();
int main()
{
int select;
void (*func[3])() = {one,two,three};
while(1)
{
cin>>select;
if(select < 0||select > 2) return 0;
else func[select]();
}
system("pause");
return 0;
}
void one()
{cout<<"doubione";}
void two()
{cout<<"doubitwo";}
void three()
{cout<<"doubithree";}