欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法笔记—指针

程序员文章站 2022-03-26 12:37:42
...

1.什么是指针

首先解释变量在内存中是如何存放的。
在计算机中,每个变量都会存放在内存中分配的一个空间, 而每种类型的变量所占的空 间又是不一样的,例如 int 型的变量占用 4Byte,而long long 型的变量占用 8Byte。可以把一个字节理解为一个“房间”,这样一个 int 型的变量就需要占用 4 个连续的“房间”。

每个房间都会有一个房间号。 对应在计算机中,每个字节(即房间非都会有一个地址(即房间号〉, 这里的地址就起房间号的作用, 即变量存放的位置, 而计算机就是通过地址找到某个变量的。 变量的地址一般指它占用的字节中第一 个字节的地址,也就是说,一个 int 型的变量的地址就是它占用的 4Byte 当中第一个字节的地址。

一个房间号 “指向 ”一个房间,对应到计算机上就是一个地址 “指向 ” 一个变量,可以通过地址来找到变量。在C语言中用 “指针” 来表示内存地址、(或者称指针指向了内存地址〉,而如果这个内存地址恰好是某个变量的地址,那么又称“这个指针指向该变量”。

我们需要明白指针的四个方面:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区

//这是一个普通的整型变量
int p;
/*从p开始,先与*结合,故p是一个指针,再与int结合,说明指针所指向的内容为int型
 所以P是一个返回整型数据的指针*/    
int *p; 
/*从p开始,先与[]结合,说明p是一个数组,再与int结合,说明数组里的元素是整型
所以P 是一个由整型数据组成的数组*/
int p[3]; 
/*从p开始,先与[]结合,因为其优先级比*高,故p是一个数组,再与*结合,说明数组里的元素是指针类型,然后再与int结合,
说明指针所指向的内容的类型是整型的,所以p是一个由返回整型数据的指针所组成的数组 */ 
int *p[3];  

(1)指针的类型

只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。

int*ptr; //指针的类型是int*
char*ptr; //指针的类型是char*
int**ptr; //指针的类型是int**

(2)指针所指向的类型

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
int*ptr; //指针所指向的类型是int
char*ptr; //指针所指向的的类型是char
int**ptr; //指针所指向的的类型是int*

&变量  即获取变量的地址

2.指针变量

指针变量的定义和普通变量有所区别, 它在某种数据类型后加星号*来表示这是一个指针变量,指针变量存放的是地址, 而&则是取地址运算符, 因此给指针变量赋值的方式一般是把变量的地址取出来, 然后赋给对应类型的指针变量:

注意:int*是指针变量的类型, 而后面的p才是变量名, 用来存储地址, 因此地址&a是赋值给p而不是*p的.

//指针变量p存放了a的地址;在定义指针p的同时将a的地址赋给指针p。
int a; 
int* p=&a; 
//等同于 
int a; 
int* p;
p=&a; 


//给多个指针变量初始化 
int a,b; 
int *p1=&a,*p2=&b; 
#include<stdio.h>
int main(){
	int a;
	//将a的地址赋值给p,指针变量p存放了a的地址 
	int* p=&a;
	a=233;
	//*p获取这个地址中存放的元素。 
	printf("%d\n",*p);//输出233 
	return 0;
}
#include<stdio.h>
int main(){
	int a;
	int* p=&a;
	*p=233;
	printf("%d,%d\n",*p,a);//输出233,233 
	return 0;
}

3.指针数组

数组a的首地址为&a[0],数组名称也作为数组的首地址使用,a=&a[0];  

#include<stdio.h>
using namespace std;
int main(){
	int a[10]={1};
	int* p=a;//a作为数组a的首地址&a[0]被赋值给指针变量p 
	printf("%d\n",*p);//输出1 
	return 0;
} 
#include<stdio.h>
int main(){
	int a[10];
	//a+i等同于&a[i](地址) 
	for(int i=0;i<10;i++){
		scanf("%d",a+i);
	}
	for(int i=0;i<10;i++){
		printf("%d ",*(a+i));
	}
	return 0;
} 

指针变量可以使用自增操作, 因此可以这样枚举数组中的元素

#include<stdio.h>
int main(){
	int a[5]={1,2,3,4,5};
	for(int* p=a;p<a+5;p++){
		printf("%d ",*p);
	}
	return 0;
} 

4.指针参数

使用指针作为参数, 交换两个数。

把&a(a 的地址)和&b(b 的地址)作为参数传入,使得 swap 函数中 int* 型指针变量 a 存放&a、指针变量 b 存放&b 。这时, swap 函数中的 a和 b 都是地址, 而*a和 *b 就是地址中存放的数据, 可以 “看成” 是 int 型变量.

#include<stdio.h>
void swap(int* a,int* b){
	int temp=*a;
	*a=*b;
	*b=temp;
}
int main(){
	int a=1,b=2;
	int *p1=&a;
	int *p2=&b;
	swap(p1,p2);
	printf("a=%d,b=%d\n",*p1,*p2);
	return 0;
} 

算法笔记—指针

 

关于指针的博客 https://blog.csdn.net/constantin_/article/details/79575638

相关标签: 指针