对于一个函数,用指针当形参,传递的值是实参指针的值,是一个int,而在函数中对这个指针即int做任何操作是不影响外部的指针的,但是如果修改指针指向数据的值,则就改变了数据的值。
指针:
*是 获得地址所对应的数据的信息。
单指针。
注意小心越界。还有就是对于函数使用指针做形参的情况。指针做参数,实参将地址传递给形参,对形参地址的操作不会改变实参的地址,而形参指向地址的数据进行更改时,会对实参指向的值也进行改动:
void cpyAToB(char *a,char *b){
//a=b;//直接改变形参的地址是无法改变实参的地址的
while(*b)
*a++=*b++;//根据直接改变指针指向数据的值,实现对实参的更改操作。
*a='\0';
}
指针使用时,
strNode* s1,*s2;
要在一个语句中声明两个指针,必须写两个*,而不是将strNode*看做为一个整体的指针数据结构。
对于多重指针例如
char **p; 创建多重指针时,为指针分配了多个地址,一个地址指向另一个地址,直至指向目标。 这类指针的初始化必须以一个已有的存在的指针类进行初始化,或者指向空。
对于指向NULL;
char*** P=NULL;
char*** Q='\0';
NULL其实就是0;定义指针等于NULL,即使其指向0的地址,而0的地址是不可寻址的,所以指针就为空了,而对于'\0','\0'就是int 0;举例:
int p='\2';
这里就是p=2.
指针类似于数组,一个单指针就是一单数组,则一个多重指针,类似与一个多维数组,则当声明一个多重数组时,譬如一个int*** p;内存为它提供了三个位置放地址,一个放
p.p中存放的地址是指向 指向 指向int的指针 的指针的地址。 *p中的地址是 指向 指向int的指针 的指针的地址,**p中的地址是 指向 int的指针的地址,只有***p中存放的才是int。
而对于一个这样的多重指针的初始化,初始时是 int*** p;是对p进行初始化,所以等号右边应该是地址,是指向 指向 指向int 的指针 的指针的 指针的地址。要对其赋值的话,就必须用一个低一级的指针,即int** q;然后要对q赋值要有一个int * t;然后t需要一个int。。。。
int n=0;
int* t=&n;
int** q=&t;
int*** p=&q;
指针与数组与函数:
int *p[n];//指针数组,指针保存在数组中,p[i]为指针
int (*p)[n];//定义一个指向含有n个元素的以为数组的指针。
int *p();//定义一个返回int*指针的函数
int (*p)();//p为一个返回整数的函数指针。
分析的方法,带括号则*是和p在一起的,p就是一个指针,不带括号是,是int与*在一起,组成一个int*,即为指向int的指针,是一种数据类型。
引用:
&是对数据获得地址的操作。
&的用法与*类似,但引用就是给数据取一个别名,对别名的任何操作都相当与直接对原来的数据进行操作。
int p=2;
int &q=p;
q++;
p++;
引用传值时可以进行对形参的操作就相当与对实参的操作。
void swapp(int& a,int &b){
int c=b;
b=a;
a=c;
}
int p=2;
int q=3;
swapp(p,q);
unsigned int p=25525;
unsigned int q=124124;
p=q&p;