赞
踩
如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元,编译系统根据程序中定义的变量类型,分配一定长度的空间。
内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。将地址形象化地称为“指针”。
(书上写的,反正我看的有点晕,不如直接用例题和图解来理解,嘿嘿)
指针变量基础类型
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); //这是一个指向有一个整型参数且返回类型为整型的函数的指针
指针也是有地址的,毕竟是个变量,肯定得有地方存他嘛。
#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
下面几个例子都是交换两个数。
#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 位置和数值都没有改变。
#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地址不变,其储存的数据交换,从而指针位置也不变,其指向的数据改变。
#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 没变。
#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储存的数值交换,其值也相应交换。
#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并没有变。
任给三个数,按从大到小排序
#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语言指针也是第一次学(必修课),虽然费了很多事也很用心,但肯定有不对的地方,若有疑惑、建议或者批评,还望指出,我一定虚心接受。希望找一些志同道合的朋友一起学习,若是有大神想带我,哈哈哈,求之不得。毕竟刚入这圈子,还望支持点下赞,谢谢,哈哈哈。下一个博文会写指针引用数组的知识,有兴趣的关注下哦,嘿嘿。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。