关于指针的一些小知识点

定义说明
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), *a0行,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=7swap3(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本身的操作,其值发生了对调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值