C语言指针变量--图示易懂

1. 指针是什么

如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元,编译系统根据程序中定义的变量类型,分配一定长度的空间。
内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。将地址形象化地称为“指针”。
(书上写的,反正我看的有点晕,不如直接用例题和图解来理解,嘿嘿)

2. 指针变量

指针变量基础类型

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;     /* 一个字符型的指针 */

int p; //这是一个普通的整型变量
int *p; //这是一个返回整型数据的指针
int p[3]; //这是一个由整型数据组成的数组
int *p[3]; // 这是一个由返回整型数据的指针所组成的数组
int (*p)[3]; //这是是一个指向由整型数据组成的数组的指针
int **p; //这是指向整数地址(指针)的一个指针。
int (*p)(int); //这是一个指向有一个整型参数且返回类型为整型的函数的指针

例题视图说明

例1.

指针也是有地址的,毕竟是个变量,肯定得有地方存他嘛。

#include<stdio.h>
int main()
{
    int a = 3;
    int *p;//指针变量p的类型为int *
    p = &a;//把指针变量p初始化为a的地址
    printf("%d\n",a);//输出变量a的值 3
    printf("%d\n",&a);//输出变量a的地址 1703724
    printf("%d\n",p);//输出指针变量p的值,即是a的地址 1703724
    printf("%d\n",&p);//输出指针变量p地址的值 1703720
    printf("%d\n",*p);//*指的是“取内容”,意思是“取p指向地址”的内容 3
    return(0);
}

3
1703724
1703724
1703720
3

例2:

下面几个例子都是交换两个数。

#include<stdio.h>
int main(){
	int n1, n2,p;//定义三个整型变量
	int * p1, * p2,*p3;//定义三个指针变量
	n1=1;
	n2=2;
	p1=&n1;//把n1的地址传给指针变量P1
	p2=&n2;//把n2的地址传给指针变量p2
	printf("%d   %d\n",p1,p2);//打印P1 P2也就是n1 n2的地址 1703724  1703720
	printf("%d       %d\n",*p1,*p2);//打印p1 p2地址存在的两个数据也就是n1 n2     1  	 2

	printf("%d  %d\n",&n1,&n2);//打印n1 n2的地址  1703724  1703720
	printf("%d  	%d\n",n1,n2);//打印n1 n2    1 	2
	//通过中间指针变量p1 p2两个指针进行交换位置
	p3 = p1;
	p1 = p2;
	p2 = p3;
	printf("%d   %d\n",p1,p2);//打印交换后的地址 p1 p2  1703720  1703724
	printf("%d       %d\n",*p1,*p2);//打印交换地址后P1 p2存的数据  2 1

	printf("%d  %d\n",&n1,&n2);//打印n1 n2的地址 1703724  1703720
	printf("%d  	%d\n",n1,n2);//打印n1 n2 1 2
	return 0;
}

1703724  1703720
1     	 2
1703724  1703720
1  		 2
1703720  1703724
2        1
1703724  1703720
1  		 2

在这里插入图片描述
p3 = p1;
p1 = p2;
p2 = p3;表示两个指针位置交换。现在只是p1 p2两个指针交换了n1 n2的值并没有变。通过上下对比可以看出,p1 p2位置换了所对应的数值*p1 *p2也变了;n1 n2 位置和数值都没有改变。

在这里插入图片描述

例3:

#include<stdio.h>
int main() {
	int n1, n2, p;//定义三个整型变量
	int* p1, * p2, * p3;//定义三个指针变量
	n1 = 1;
	n2 = 2;
	p1 = &n1;//把n1的地址传给P1
	p2 = &n2;//把n2的地址传给p2
	printf("%d   %d\n", p1, p2);//打印P1 P2也就是n1 n2的地址 1703724   1703720
	printf("%d       %d\n", *p1, *p2);//打印p1 p2地址存在的两个数据也就是n1 n2     1  	 2
	printf("%d  %d\n", &n1, &n2);//打印n1 n2的地址  1703724  1703720
	printf("%d  	%d\n", n1, n2); //打印n1 n2    1 	2
	//通过中间变量p将指针p1 p2对应的值进行交换,也就是n1 n2进行交换
	 p  = *p1;
	*p1 = *p2;
	*p2 =  p;

	printf("%d   %d\n", p1, p2);//打印交换后的地址 p1 p2  1703724   1703720
	printf("%d       %d\n", *p1, *p2);//打印交换地址后P1 p2存的数据  2  1

	printf("%d  %d\n", &n1, &n2);//打印n1 n2的地址() 1703724  1703720
	printf("%d  	%d\n", n1, n2);//打印n1 n2   2	1
	return 0;
}
1703724   1703720
1       2
1703724  1703720
1       2
1703724   1703720
2       1
1703724  1703720
2       1

在这里插入图片描述

*p1 *p2对应的是1 2 两个数字, p = *p1;*p1 = *p2; p2 = p;为指针对应的两个数字的交换,通过对比发现,p1 p2的位置没变,但p1 *p2对应的数变了,n1 n2位置也没有变,但对应的数值也变了。即n1 n2地址不变,其储存的数据交换,从而指针位置也不变,其指向的数据改变。

在这里插入图片描述

例4

#include<stdio.h>
void swap(int a,int b){
	int t;
	t=a;
	a=b;
	b=t;
	printf("%d  %d\n",a,b);//2  1
}

int main() {
	int n1, n2;
	n1 = 1;
	n2 = 2;
	swap(n1,n2);
	printf("n1=%d  n2=%d",n1,n2); //n1=1  n2=2
}
2   1
n1=1  n2=2

此例swap函数是直接交换a,b(即传进的两个数),传入时,n1的值给了x,b的值给了y,调用swap函数后,是函数a b的数交换了,而n1 n2 没变。

在这里插入图片描述

例5

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

此题与例三对应,swap函数交换的是a b对应的两个数交换。所以n1 n2储存的数值交换,其值也相应交换。
在这里插入图片描述

例6

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

此题于例二对应。swap函数是两个指针变量之间的交换,所以交换后a b对应的数字交换了,而n1 n2并没有变。
在这里插入图片描述

例7

任给三个数,按从大到小排序

#include<stdio.h>
int swap(int *p1,int *p2) {
	int p3;
	p3 = *p1;
	*p1 =* p2;
	*p2 = p3;
	return 0;
}
int main() {
	int a = 3, b = 0, c =6;
	int * p1, * p2, * p3;
	p1 = &a;
	p2 = &b;
	p3 = &c;
	printf("%d   %d   %d\n", p1, p2,p3);//15989524   15989512   15989500
	printf("%d   %d   %d\n", *p1, *p2, *p3);//3   0   6
	printf("%d   %d   %d\n", &a, &b, &c);//15989524   15989512   15989500
	printf("%d   %d   %d\n", a,b,c);//3   0   6
	if (a < b)
		swap(p1, p2);
	if (a < c)
		swap(p1, p3);
	if (b < c)
		swap(p2, p3);
	printf("%d   %d   %d\n", p1, p2, p3);//15989524   15989512   15989500
	printf("%d   %d   %d\n", *p1, *p2, *p3);//6  3  0
	printf("%d   %d   %d\n", &a, &b, &c);//15989524   15989512   15989500
	printf("%d   %d   %d\n", a, b, c);//6  3  0
}
15989524   15989512   15989500
3   0   6
15989524   15989512   15989500
3   0   6

15989524   15989512   15989500
6   3   0
15989524   15989512   15989500
6   3   0

其判断顺序为 红(if (a < b))>>蓝(if (a < c))>>绿(if (b < c)) (第一反应就是这个顺序,其他顺序排列不对,具体为啥,我也不太明白)。此替换类型与例3一样,只是其地址储存的数据之间的交换,其原来的变量和指针的位置都没有改变。
在这里插入图片描述
说明
本人大一小白一名,热爱编程、人工智能(目前在机器学习阶段)等,C语言指针也是第一次学(必修课),虽然费了很多事也很用心,但肯定有不对的地方,若有疑惑、建议或者批评,还望指出,我一定虚心接受。希望找一些志同道合的朋友一起学习,若是有大神想带我,哈哈哈,求之不得。毕竟刚入这圈子,还望支持点下赞,谢谢,哈哈哈。下一个博文会写指针引用数组的知识,有兴趣的关注下哦,嘿嘿。

发布了4 篇原创文章 · 获赞 23 · 访问量 421

猜你喜欢

转载自blog.csdn.net/weixin_45755332/article/details/105589912