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语言指针变量--图示易懂相关推荐

  1. C语言指针变量的运算

    前言 指针变量也是可以进行运算的,如指针变量对其自身加上某个整数或减去某个整数,这在内存上体现为:相对这个指针向后偏移多少个单位或向前偏移了多少个单位,这里的单位与指针变量的类型有关.在32bit环境 ...

  2. c语言两个指针变量不可以,2.C语言指针变量

    # 2.C语言指针变量 变量的指针就是变量的地址.存放变量地址的变量是指针变量.即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.因此,一个指针变量的值就是某个变量的地址或称为某变量的指针 ...

  3. C语言指针变量的使用

    C语言指针变量的定义和使用(精华) < 1分钟彻底理解指针的概念C语言指针变量的运算 > C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一 ...

  4. c语言指针变量字节,C语言指针变量类型和大小

    指针变量作为C语言中的特殊数据类型,除了用于存储内存地址之外,它与其他类型比较是否具有其他特点呢?接下来对指针类型进行分析,剖析指针类型的特点. 指针的大小与其指向的内存中存储的变量类型无关,它只与计 ...

  5. c语言指针变量的定义数组的长度,【C语言更新】指向数组的指针

    文/Edward 前面我们在讲述数组的时候曾经说过,对于数组内部元素的引用方式主要有两种,一种就是使用方括号"[]"的下标索引,另一种就是之前提到过,但是没有细致讲述的指针引用. ...

  6. c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)

    瘋子C语言笔记(结构体/共用体/枚举篇) (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student ...

  7. c语言的指针和java_C语言指针变量的定义和使用(精华)

    数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量. 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是 ...

  8. c语言学指针变量,C语言指针变量学习五

    //下面的程序演示了指针没有被人为手动分配存储空间的错误 #include int main() { int * p; int i = 5; *p = i; printf("*p=%d\n& ...

  9. C语言指针变量与一维数组

    数组元素之间的地址是相连的: 变量地址绝对不是相连的,如果找到规律那也只是一个偶然的,不是必然的: 1. 指针变量和一位数组 下面对指针数组进行分析,index(小标是从0开始),array数组是in ...

最新文章

  1. linux screen 命令详解
  2. Xilinx FPGA 仿真环境设置(ISE + Modelsim + Debussy)
  3. shell编程基础之根据输入进行相应的操作
  4. [转载] java 枚举Enum源码解析
  5. 11 User Space, Kernel Space, and the System Call API(用户空间,核空间,系统api)
  6. 《Microsoft SQL Server 2008 Analysis Services Step by Step》学习笔记十一:与Cube交互(下)...
  7. java 学习视频 从基础到精通以及框架
  8. 基于视频会议系统的应急指挥项目建设方案
  9. QT 资源管理器和.qrc文件的使用
  10. Python爬取某境外网站漫画,心血来潮,爬之
  11. 我在使用Next.js, Antd, @zeit/next-css时遇到的一些问题
  12. WIN10你不能访问此共享文件夹,因为你组织的安全策略
  13. 仿剩余金额宝数字渐慢跳动效果
  14. PC、手机老是掉线该如何排查?
  15. 【沉痛悼念】首届国医大师唐由之逝世 | 曾为毛主席治疗白内障
  16. 国家开放大学计算机应用基础终结性考试(大作业).zip
  17. EM算法从直观到数学理解
  18. Praat脚本-022 | 提取时长和音强
  19. 重写python requests库实现自动拼接url
  20. 记一次海康威视的面试经历

热门文章

  1. php如何接入微信支付接口,PHP实现微信支付(jsapi支付)流程的方法
  2. oracle数据库gi,Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)
  3. mysql8.0版本的服务器名称_云服务器Mysql安装配置
  4. java画布颜色切换_在本视频讲解演示中,扩展画布的目的是为了后面制作齿孔时操作起来方便,扩展部分更换了另一种颜色,是为了以示区别,能直观区分出票面部分。...
  5. c# 多线程实现ping 多线程控制控件
  6. Spring AOP 的切点切在Controller上没有起作用的问题。
  7. mysql mariadb的VC客户端遇到的问题
  8. Memcached的安装与使用
  9. 277. Find the Celebrity
  10. 新一代JavaScript标准,ES6即将发布