Day 3_1 C/C++ 指针

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;
}
发布了26 篇原创文章 · 获赞 3 · 访问量 221

猜你喜欢

转载自blog.csdn.net/qq_41898248/article/details/103747513
今日推荐