首页 > 代码库 > 指针初学杂记
指针初学杂记
创建一个新的指针,首先要赋值,然后在用之前一定要申请地址。即
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";}