1.指针与数组
利用数组名也是数组的首地址特性,使用指针访问数组,,同样达到遍历数组的目的
#include<stdio.h>
int main(){
int a[10] = {1,2,3,4,5,6,7,8,9,10};
for(int *p = a;p< a+10;p++)
printf("%d ",*p);
printf("\n");
for(int i = 0;i<10;i++)
printf("%d ",*(a+i));
return 0;
}
定义指针p为int型,则p++自增是指向下一个int型变量地址(虽然指针p是指向int型变量占用的四个字节的第一个字节),字节地址空间实际+4
int b[10] = {1,4,9,16,25,36};
int *p = b;
int *q = &b[5];
printf("%d %d %d",p,q,q-p);
如图,20 / 4 = 5,因为&a[0]与&a[5]相差5个int
2.指针作为函数参数
#include<stdio.h>
void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(){
//指针作为函数参数
int a = 1,b = 2;
int *p = &a,*q = &b;
swap(p,q);
printf("a = %d b =%d\n",*p,*q);
printf("a= %d b=%d",a,b);
return 0;
}
错误用法1
void swap(int *a,int *b){
int *temp;
*temp = *a;
*a = *b;
*b = temp;
}
因为定义temp时没有初始化,很有可能temp指向系统工作区间,若要使用上面这种用法,应该定义一个变量,temp指向它,这样子就不会出现temp指向系统工作区间的问题
int *temp;
int x;
temp = &x;
错误用法2
void swap(int *a,int *b){
int *temp = a;
a = b;
b = temp;
}
不能直接交换两个地址,地址也是作为一个变量进行参数传递,改变变量,并不能传回main函数
3.引用
加粗样式 使用引用能够在不使用指针的情况下,修改函数的局部变量也能影响外部变量(函数传入的参数)
引用知识给变量取一个"别名"
#include<stdio.h>
void change(int &x){
x = 1;
}
int main(){
int a = 10;
change(a);
printf("a = %d",a);//结果a = 1
return 0;
}
引用的&与取地址运算符要区别开来
上面函数参数传递使用指针的错误用法2中,在这里使用引用就能解决
#include<stdio.h>
void swap(int* &a,int* &b){
int *temp = a;
a = b;
b = temp;
}
int main(){
int x = 10,y = 20;
int *p = &x,*q = &y;
swap(p,q);
printf("x = %d y = %d\n",*p,*q);
return 0;
}