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的值 3printf("%d\n",&a);//输出变量a的地址 1703724printf("%d\n",p);//输出指针变量p的值,即是a的地址 1703724printf("%d\n",&p);//输出指针变量p地址的值 1703720printf("%d\n",*p);//*指的是“取内容”,意思是“取p指向地址”的内容 3return(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的地址传给指针变量P1p2=&n2;//把n2的地址传给指针变量p2printf("%d %d\n",p1,p2);//打印P1 P2也就是n1 n2的地址 1703724 1703720printf("%d %d\n",*p1,*p2);//打印p1 p2地址存在的两个数据也就是n1 n2 1 2printf("%d %d\n",&n1,&n2);//打印n1 n2的地址 1703724 1703720printf("%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 1703724printf("%d %d\n",*p1,*p2);//打印交换地址后P1 p2存的数据 2 1printf("%d %d\n",&n1,&n2);//打印n1 n2的地址 1703724 1703720printf("%d %d\n",n1,n2);//打印n1 n2 1 2return 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的地址传给P1p2 = &n2;//把n2的地址传给p2printf("%d %d\n", p1, p2);//打印P1 P2也就是n1 n2的地址 1703724 1703720printf("%d %d\n", *p1, *p2);//打印p1 p2地址存在的两个数据也就是n1 n2 1 2printf("%d %d\n", &n1, &n2);//打印n1 n2的地址 1703724 1703720printf("%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 1703720printf("%d %d\n", *p1, *p2);//打印交换地址后P1 p2存的数据 2 1printf("%d %d\n", &n1, &n2);//打印n1 n2的地址() 1703724 1703720printf("%d %d\n", n1, n2);//打印n1 n2 2 1return 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=2return 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 15989500printf("%d %d %d\n", *p1, *p2, *p3);//3 0 6printf("%d %d %d\n", &a, &b, &c);//15989524 15989512 15989500printf("%d %d %d\n", a,b,c);//3 0 6if (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 15989500printf("%d %d %d\n", *p1, *p2, *p3);//6 3 0printf("%d %d %d\n", &a, &b, &c);//15989524 15989512 15989500printf("%d %d %d\n", a, b, c);//6 3 0
}
15989524 15989512 15989500
3 0 6
15989524 15989512 15989500
3 0 615989524 15989512 15989500
6 3 0
15989524 15989512 15989500
6 3 0
其判断顺序为 红(if (a < b))>>蓝(if (a < c))>>绿(if (b < c)) (第一反应就是这个顺序,其他顺序排列不对,具体为啥,我也不太明白)。此替换类型与例3一样,只是其地址储存的数据之间的交换,其原来的变量和指针的位置都没有改变。
说明:
本人大一小白一名,热爱编程、人工智能(目前在机器学习阶段)等,C语言指针也是第一次学(必修课),虽然费了很多事也很用心,但肯定有不对的地方,若有疑惑、建议或者批评,还望指出,我一定虚心接受。希望找一些志同道合的朋友一起学习,若是有大神想带我,哈哈哈,求之不得。毕竟刚入这圈子,还望支持点下赞,谢谢,哈哈哈。下一个博文会写指针引用数组的知识,有兴趣的关注下哦,嘿嘿。
C语言指针变量--图示易懂相关推荐
- C语言指针变量的运算
前言 指针变量也是可以进行运算的,如指针变量对其自身加上某个整数或减去某个整数,这在内存上体现为:相对这个指针向后偏移多少个单位或向前偏移了多少个单位,这里的单位与指针变量的类型有关.在32bit环境 ...
- c语言两个指针变量不可以,2.C语言指针变量
# 2.C语言指针变量 变量的指针就是变量的地址.存放变量地址的变量是指针变量.即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.因此,一个指针变量的值就是某个变量的地址或称为某变量的指针 ...
- C语言指针变量的使用
C语言指针变量的定义和使用(精华) < 1分钟彻底理解指针的概念C语言指针变量的运算 > C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一 ...
- c语言指针变量字节,C语言指针变量类型和大小
指针变量作为C语言中的特殊数据类型,除了用于存储内存地址之外,它与其他类型比较是否具有其他特点呢?接下来对指针类型进行分析,剖析指针类型的特点. 指针的大小与其指向的内存中存储的变量类型无关,它只与计 ...
- c语言指针变量的定义数组的长度,【C语言更新】指向数组的指针
文/Edward 前面我们在讲述数组的时候曾经说过,对于数组内部元素的引用方式主要有两种,一种就是使用方括号"[]"的下标索引,另一种就是之前提到过,但是没有细致讲述的指针引用. ...
- c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)
瘋子C语言笔记(结构体/共用体/枚举篇) (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student ...
- c语言的指针和java_C语言指针变量的定义和使用(精华)
数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量. 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是 ...
- c语言学指针变量,C语言指针变量学习五
//下面的程序演示了指针没有被人为手动分配存储空间的错误 #include int main() { int * p; int i = 5; *p = i; printf("*p=%d\n& ...
- C语言指针变量与一维数组
数组元素之间的地址是相连的: 变量地址绝对不是相连的,如果找到规律那也只是一个偶然的,不是必然的: 1. 指针变量和一位数组 下面对指针数组进行分析,index(小标是从0开始),array数组是in ...
最新文章
- linux screen 命令详解
- Xilinx FPGA 仿真环境设置(ISE + Modelsim + Debussy)
- shell编程基础之根据输入进行相应的操作
- [转载] java 枚举Enum源码解析
- 11 User Space, Kernel Space, and the System Call API(用户空间,核空间,系统api)
- 《Microsoft SQL Server 2008 Analysis Services Step by Step》学习笔记十一:与Cube交互(下)...
- java 学习视频 从基础到精通以及框架
- 基于视频会议系统的应急指挥项目建设方案
- QT 资源管理器和.qrc文件的使用
- Python爬取某境外网站漫画,心血来潮,爬之
- 我在使用Next.js, Antd, @zeit/next-css时遇到的一些问题
- WIN10你不能访问此共享文件夹,因为你组织的安全策略
- 仿剩余金额宝数字渐慢跳动效果
- PC、手机老是掉线该如何排查?
- 【沉痛悼念】首届国医大师唐由之逝世 | 曾为毛主席治疗白内障
- 国家开放大学计算机应用基础终结性考试(大作业).zip
- EM算法从直观到数学理解
- Praat脚本-022 | 提取时长和音强
- 重写python requests库实现自动拼接url
- 记一次海康威视的面试经历
热门文章
- php如何接入微信支付接口,PHP实现微信支付(jsapi支付)流程的方法
- oracle数据库gi,Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)
- mysql8.0版本的服务器名称_云服务器Mysql安装配置
- java画布颜色切换_在本视频讲解演示中,扩展画布的目的是为了后面制作齿孔时操作起来方便,扩展部分更换了另一种颜色,是为了以示区别,能直观区分出票面部分。...
- c# 多线程实现ping 多线程控制控件
- Spring AOP 的切点切在Controller上没有起作用的问题。
- mysql mariadb的VC客户端遇到的问题
- Memcached的安装与使用
- 277. Find the Celebrity
- 新一代JavaScript标准,ES6即将发布