首页 > 代码库 > 指针初学杂记

指针初学杂记

创建一个新的指针,首先要赋值,然后在用之前一定要申请地址。即

 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";}