定义 | 说明 |
---|---|
int p | 定义整型变量 |
int *p | 定义指向int的指针变量 |
int a[10] | 定义一个int数组 |
int *p[10] | 定义一个指针数组,其中每个数组元素指向一个int型变量的地址 |
int (*p)[10] | 定义一个数组指针,指向int[10]类型的指针变量 |
int func() | 定义一个函数,返回值为int型 |
int *func() | 定义一个函数,返回值为int *型 |
int (*p)() | 定义一个指向函数的指针,返回值为int |
int **p | 定义一个指向int的指针的指针,二级指针 |
指向二维数组的指针
int array[3][5] | 二维数组名称,array为数组首地址 |
---|---|
int (*a)[5] | 定义一个指向int [5]类型的指针变量 |
a[0], *(a+0), *a | 0行,0列元素地址 |
a+1 | 第一行首地址 |
a[1], *(a+1) | 第1行,0列元素地址 |
a[1]+2,*(a+1)+2,&a[1][2] | 第1行,2列元素地址 |
(a[1]+2),(*(a+1)+2),a[1][2] | 第1行,2列元素的值 |
指针和函数
int fun1(char *, int);
int (*pfun1)(char *,int);
pfun1 = fun1;//指向函数的指针
int a= (*pfun1)(“abc”,3);//通过函数指针调用函数
指针类型转换
指针的数据类型要跟所指向的数据的类型一致
若类型不一致需进行“强制类型转换”
float f = 12.3;
int *p;
p = (int *)&f
值传递,址传递,引用传递
void swap1(int x, int y) //值传递
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d, y=%d\n”, x, y);
}
void swap2(int *px, int *py) //址传递
{
int tmp=*px;
*px=*py;
*py=tmp;
}
void swap3(int &x, int &y) //引用传递
{
int tmp=x;
x=y;
y=tmp;
}
void main()
{
int a=2,b=7;
swap1(a,b) ;
printf(“a=%d, b=%d\n”, a, b);
a = 2,b=7;
swap2(&a,&b);
printf(“a=%d, b=%d\n”, a, b);
a = 2,b=7;
swap3(a,b) ;
printf(“a=%d, b=%d\n”, a, b);
}
输出结果:
x=7, y=2
a=2, b=7
a=7,b=2
a=7,b=2
值传递:swap1函数的操作是将x,y进行对调。我们可以设想,在swap1函数执行语句的最前面,隐含地存在x=a; y=b;这两条语句。当a,b把值赋给x,y之后,对x,y不论再做什么操作,都不会影响到a,b本身。
址传递:在swap2函数里,隐含地存在px=&a; py=&b;这两条语句,这表示a的地址代入到了px,b的地址代入到了py。这样一来,对*px, *py的操作就是a,b本身的操作。所以a,b的值被对调了。
引用传递:因为定义的x,y前面有&取地址符,调用函数swap3时,a,b分别代替了x,y,即x,y分别引用了a,b变量。因此,函数里的操作,实际上是对实参a,b本身的操作,其值发生了对调。