1.指向常量的指针。
在指针定义语句的类型前加const, 表示指向的对象是常量。
定义指向常量的指针只限制指针的间接访问操作,而不能规定指针指向的值本身的操作性规定。
定义:const int *p;
目的:主要是保持*p的内容不被更改,常常用于函数的参数传递中,保持原来的数据不被修改。
for example: strcpy(char *, const char *);在其中,原数据用了指向常量的指针来限制,保证其不被修改
char *是要一个指针型的变量,const char *是要一个指向常量的指针变量,但是指针可以修改以指向其他的值:
2.指针常量
定义:在指针定义语句中的指针名前加const, 表示指针本身是常量。
定义指针常量时必须初始化。
可以这样理解指向常量的指针和指针常量
区别:
1.指向常量的指针限制了*p的操作,而指针常量没有限制*p的操作
2.在形式上,如果const和指针名挨着,则证明是指针常量,即指针的值不能做为左值,而在最前面,则 为指向常量的指针,即*p的值不能被修改.
3.指向常量的常量指针
必须在定义的时候初始化。
定义 const int * const p;则告诉编译器,p和*p都是常量,都不能作为左值被修改。
指针与函数:
用指针参数来返回到上层的函数的值,例如:swap(int *, int *);
传递指针的函数调用实现过程为:
1.函数声明中指明指针参数
2.函数调用中传递以变量的地址,即&a
3.函数定义中对形参进行间接访问,即*p.
4.指针函数:即返回一个地址
返回指针的函数称为指针函数。指针函数不能把在它内部说明的具有局部作用域的数据地址作为返回值。
但可以返回堆地址,可以返回全局或静态变量的地址,但不要返回局部变量的地址。
5.void指针
void指针是空类型指针,它不指向任何类型,即void指针仅仅只是一个地址。所以空指针不能进行加减运算,也不能进行间接引用。
6.字符数组和字符串常量
在C++中,有两类字符串,一类是字符数组,一类是字符串常量。由“”标识,但不是用来初始化数组的字符串,是字符串常量。字符串常量的类型是指向字符的指针(char *)。字符串常量以'\0'结尾,这种类型的字符串称为C字符串。
7.字符指针
输出字符指针就是输出字符串。输出字符指针的间接引用就是输出单个字符。
8.字符串赋值
由于字符数组名是常量指针,故不能对其进行赋值,但是可以使用strcpy()标准函数来对其进行赋值。
char buffer1[10];
char buffer2[10];
strcpy(buffer1,"hello");
strcpy(buffer2,buffer1);strcpy()只适用于'\0'结束的字符串
若要对其他类型的数组进行赋值,则可采用memcpy();
9.指针数组
char *proname[]={"Fortran","c","c++"};若每个元素都是一个指针,则为指针数组。相当于proname数组中存了三个指针,每个指针分别指向,Fortran,c,c++,与二维数组有所差别,二维数组必须表示成char name[3][8],如果在大数据情况下,是浪费空间的。
10.指向指针的指针
指针数组名是指向指针的指针(即二级指针)。
char *pc[]={"a","b","c"};
char **ppc;
ppc=pc;
传递数组给函数就是传递指针给函数,那么,传递指针数组给函数就是传递二级指针给函数。
#i nclude<iostream.h>
//
#i nclude<string.h>
//using namespace std;
void Print(char *[],int);
int main()
{
char * pn[]={"Fred","Barney","Wilma","Betty"};
int num=sizeof(pn)/sizeof(pn[0]);
Print(pn,num);
return 0;
}
void Print(char* arr[],int len)
{
for(int i=0;i<len;i++)
cout<<(int)arr<<" "<<arr<<endl;
}
11.NULL和void *的区别
NULL与void *是不同的概念,NULL是一个值,一个指针值,任何类型的指针都可赋予该值。而void*是一种类型,是一种无任何类型的指针。
12.函数指针
每个函数都有地址,指向函数地址的指针称为函数指针。函数指针指向代码区中的某个函数,通过函数指针可以调用相应的函数。
定义:int(*func)(char a,char b);//这是定义函数指针,()的优先级大于*。
int *func(char a,char b);//这是定义函数,返回的类型为地址
#i nclude<iostream>
using namespace std;
int (*fp)(int a,int b);
int fn(int a,int b);
int main(int argc,char *argv[])
{
fp=fn;
cout<<fp(3,5);
return 0;
}
int fn(int a,int b)
{
return a+b;
}//函数指针的调用,函数指针的类型必须与函数的类型相同,才能指向这个函数
对字符串操作的函数一般用指针遍历字符串,直至指针指向NULL,当指针指向除字符串的其他类型时的数组,函数要知道数组中元素的个数,或者数组中的最后一个元素。