指针初学杂记

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

 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";}
原文地址:https://www.cnblogs.com/kbe317/p/3825435.html