1.学习指针,我们得先了解指针是什么?

指针其实就类似一个地址,我们使用的编译系统会根据程序划分一定的空间来存储变量,而通过一个地址,我们就可以找到那个空间,找到我们想要的变量,通过地址就可以找到所需的变量单元,可以说,地址指向该变量单元。这就像我们住旅馆里会有房间号,根据房间号我们就可以找到我们对应的房间。

注意:C语言中数据是分类型的,对不同的类型,其储存单元的大小和储存方式是不一样的,如整数以补码形式存放,实数以对数形式存放。所以如果指定了一个地址,没办法从中调出所需要的数据,因为不知道从几个字节获取信息还有获取信息的方式,也就是该类型。所以,C语言中的地址包括位置信息和它所指向的数据类型信息,也就是带类型的地址。

2.区分储存单元的地址和储存单元的内容,了解变量访问的方式

当定义a,b,c三个整形变量时,系统会分配给他们三个不一样的地址,但a,b,c值可能相等。在程序中一般是引用变量名来引用变量的值(对变量的访问都是通过地址进行的)。

a.变量的输入

如:scanf("%d",&i),在执行时,键盘把输入的值储存到该地址的存储单元中。

如果有   k=i+j;

b.直接访问:系统分别从i和j的地址中取出i和j的值,相加,然后将该值送到k所在的内存单元中。

c.间接访问:比如将i的地址存放在另一变量中,然后通过该变量找到i的地址,从而找到i的值。

比如(i_pointer=&i)便是将i的地址存放到i_pointer里。

指向就是通过地址来实现的,假设i_pointer中的值是变量i的地址,这样通过i_pointer就能找到i的地址,从而找到变量i的内存单元。这便是一种指向关系,我们将地址形象的称为“指针”。意思是通过他能找到以他为地址的内存单元。如果有一个变量专门来存放另一变量的地址(即指针),则称他为“指针变量”。上面的i_pointer,就是一个指针变量。

3.了解指针变量

a.通过指针变量访问整型变量

例如:

#include<stdio.h>
int main()
{int a=100,b=100;                //定义整型变量a,b并初始化int *i_pointer1,*i_pointer2;    //定义整型指针变量i_pointer1=&a;                  //把变量a的地址赋值给指针变量i_pointer2=&b;                  //b也一样 printf("a=%d,b=%d\n",a,b);        //输出a,b的值printf("*i_pointer1=%d,*i_pointer2=%d",*i_pointer1,*i_pointer2); return 0;
}

运行结果

代码中“*”表示指向,*i_pointer1表示“指针变量i_pointer1指向的变量”,也就是a,程序中有俩处*i_pointer1和*i_pointer2,他们代表的含义不同,第一处*i_pointer1和*i_pointer2前面的*表示定义,表示该变量是指针变量,最后的*i_pointer1和*i_pointer2表示*i_pointer1和*i_pointer2所指向的变量

注意:定义指针变量时应该有类型名

*i_pointer1;                 //企图定义i_pointer1为指针变量,出错
int *i_pointer1;             //正确,必须指定指针变量的类型 

b.如何定义指针变量

定义指针变量的一般形式为      类型名  *  指针变量名

//下面都是合法的
float * pointer3;             //pointer3是指向float型变量的指针,简称float指针
char * pointer4;              //pointer4是指向char型变量的指针,简称char指针
//也可以在定义指针变量时,同时对它初始化,如
int *pointer1 = &a,*pointer2 = &b; 
#include<stdio.h>
int main()
{int a=100,b=100;                //定义整型变量a,b并初始化int *i_pointer1,*i_pointer2;    //定义整型指针变量i_pointer1=&a;                  //把变量a的地址赋值给指针变量i_pointer2=&b;                  //b也一样 printf("a=%d,b=%d\n",a,b);        //输出a,b的值printf("*i_pointer1=%d,*i_pointer2=%d",*i_pointer1,*i_pointer2); return 0;
}

前面这里的6.7行与其有区别,不能写成“*i_pointer1=&a,*i_pointer2=&b”,因为指针变量前的“ * ”表示该变量为指针变量,而变量名为i_pointer1和i_pointer2,赋值应该使用变量名。

一个变量的指针的含义包括俩个方面,一是以储存单元为编号表示的纯地址(如编号为2000的字节),一是它指向的储存单元的数据类型(如int,char,float等)。

指针变量中只能存放地址(指针),不要将一个整数赋值给一个指针变量,如:

* pointer1=100;                 //pointer1是指针变量,不合法,地址只能用取地址符“ & ”。

4.学习如何引用指针变量

(1)给指针变量赋值,如:p = &a;              //把a的地址赋值给指针变量p 指针变量p的值是变量a的地址,p指向a
(2)引用指针变量指向的变量,如:p = &a;printf("%d",*p);    //以整型的形式输出指针变量p所指向的变量的值如果出现下面赋值语句*p = 1;    //表示将整数1赋值给p指向的的变量,相当于将1赋值给a,即a=1;
(3)引用指针变量的值,如:printf("%o",p);   //以八进制的形式输出指针变量p的值,相当于输出a的地址 

(1)& 取地址运算符,&a是变量a的地址

(2)* 指针运算符(“间接访问”的运算符),*p代表指针变量p指向的对象

举个例子:输入a和b俩个整数,按照先大后小的顺序输出a和b。

思路:用指针的方法来解决这个问题,不交换整型变量的值,而是交换俩个指针变量的值。

#include<stdio.h>
int main()
{int *p1,*p2,*p,a,b;                      //p1,p2,p的类型为int *scanf("%d %d",&a,&b);                    //输入俩个整数p1=&a,p2=&b;                             //使p1,p2分别指向a,bif(a<b){                                 //条件判断并交换 p=p1;p1=p2;p2=p;} printf("a=%d b=%d\n",a,b);                 //输出a,b的值printf("p1=%d p2=%d\n",p1,p2);           //输出p1,p2的地址 printf("max=%d min=%d",*p1,*p2);           //输出p1,p2的值return 0;
}

结果为:

注意:a和b的值没有交换,还是原来的值,只是指针变量p1,p2的指向变了。

5.指针变量作为函数参数

函数参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。

例如:题目和上面一样

#include<stdio.h>
void swap(int *p1,int *p2);
int main()
{int *p1,*p2,*p,a,b;                      //p1,p2,p的类型为int *scanf("%d %d",&a,&b);                    //输入俩个整数p1=&a,p2=&b;                             //使p1,p2分别指向a,bif(a<b){                                 //条件判断并交换 swap(p1,p2);} printf("a=%d b=%d\n",a,b);                 //输出a,b的值printf("max=%d min=%d",*p1,*p2);           //输出p1,p2的值return 0;
}
void swap(int *p1,int *p2)                  //定义函数swap
{int temp;temp=*p1;*p1=*p2;*p2=temp;}

运行结果:

swap函数的俩个形参p1,p2是指针变量。

void swap(int *p1,int *p2)                  //定义函数swap
{int *temp;*temp=*p1;p1=*p2;p2=*temp;
}
如果这样语句是错的,*temp是指针变量temp所指向的变量,但是没有赋初值,出错
void swap(int x,int y)
{int temp;temp=x;x=y;y=temp;
}

如果想通过函数调用得到n个要改变的值,可以这样做:

①在主调函数中设n个变量,用n个指针变量指向它们;

②设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值;

③在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的值,也就是相关变量的地址传给函数的形参。

④在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值;⑤主调函数中就可以使用这些改变了值的变量。

注意:不能企图通过改变指针形参的值而使指针实参的值改变。上面的例子其实只改变了x,y的值,没有改变a,b的值。

void swap(int *p1,int *p2)                  //定义函数swap
{int *p;p=p1;p1=p2;p2=p;
}

如果是这样,也无法实现,C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针也遵循这一原则。

再给一个例子:输入3个整数a,b,c,要求按大到小的顺序将他们输出,用函数实现。

#include<stdio.h>
void swap(int *p1,int *p2);
void exchange(int *a1,int *a2,int *a3);
int main()
{int *p1,*p2,*p3,a,b,c;                         //p1,p2,p3的类型为int *scanf("%d %d %d",&a,&b,&c);                    //输入3个整数p1=&a,p2=&b,p3=&c;                             //使p1,p2,p3分别指向a,b,cexchange(p1,p2,p3);printf("a=%d b=%d c=%d\n",a,b,c);              //输出a,b,c的值return 0;
}
void swap(int *p1,int *p2)                         //定义函数swap
{int temp;temp=*p1;*p1=*p2;*p2=temp;
}
void exchange(int *a1,int *a2,int *a3)
{if(*a1<*a2){swap(a1,a2);}if(*a1<*a3){swap(a1,a3);} if(*a2<*a3){swap(a2,a3);}
}

(如果有错,请大佬指出) 

C语言指针学习(1)相关推荐

  1. C语言指针学习与使用

    C语言指针学习与使用 计算机存储 想要更好的使用指针,需要对计算机的存储有一定的概念和了解.下面的图片中展示了计算机的硬件结构: 存储设备除了上述的主存储器外,还有其他的一些在执行程序时可能会用到的存 ...

  2. 有关C语言指针学习思想的随笔常用形式的总结(原创)

    对于成功的使用C程序设计语言而言,正确的理解并使用指针是十分重要的,我在学习数据结构的时,体会的更加深入,有必要对几种常见指针使用方法作一下小结. 什么是指针?指针可以看作是存放内存地址的变量,如果一 ...

  3. C C++语言指针学习!(基础篇!) 指针的掌握真滴是分水岭呦~

    指针就是其值为内存单元地址的变量! 一个指针包含的则是一个变量的地址! 每一个指针变量名字前面都必须有一个:*符号作为前缀! 指针运算符: #include<iostream> using ...

  4. C语言指针学习(续)

    五.数组和指针的关系 int array[10] = {0,1,2,3,4,5,6,7,8,9},value; ... ... value = array[0];//也可以写成 value = *ar ...

  5. C语言指针学习 小泉的难题

    小泉的难题 Description 机械实验班有个同学叫小泉,有一天数学老师给小泉布置了一道个人作业,给小泉M(M<=100)组数据,每组数据有N个正整数(N<=100)让他把每组的N个数 ...

  6. C语言指针学习(6)指针数组-字符指针数组

    ** 一.指针数组(比较常见) ** 2.指针数组定义:数组中每个元素都是一个指针(地址) 每个元素只能是地址,不能是普通数据 3.定义指针数组的语法: 数据类型 *数组名[数组长度/元素个数]={地 ...

  7. C语言指针学习中易犯的错误

    1.向null地址处copy数据 char *str = NULL; strcpy(str,"aaaaabbbbb"); 错误! NULL是操作系统保护的空间,不能往里面拷贝数据: ...

  8. C语言 入门教程||C语言 指针||C语言 字符串

    C语言 指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要 ...

  9. c语言定义node类型指针,C语言指针的概念

    在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍.为了正确地访问 ...

最新文章

  1. SPI flash配置
  2. 解题报告:AcWing 1165. 单词环(01分数规划、hash、经验优化)
  3. Nature:剖腹产到底好不好?——肠道菌群的视角
  4. string 替换_vim怎么查找与替换文字?比Windows记事本效率高太多了
  5. Swift-Tips之重复字符串
  6. XVIII Open Cup named after E.V. Pankratiev. GP of Urals
  7. Android串口通信-AndroidStudio
  8. db2 本地db 到实例_如何登录到FreeCodeCamp的本地实例
  9. amd 虚拟化怎么开_性能碾压7nm安培 AMD CDNA计算卡16日发布:Radeon不再-AMD,CDNA,7nm,MI100,加速卡 ——快科技(驱动之家旗下媒体)-...
  10. AI加持 百度输入法语音识别准确率相对提升15%
  11. 《Linux编程》课堂测验 ·002【Shell编程】
  12. Atitit 数据库 负载均衡 方法总结 目录 1. 对称模型负载均衡 vs 非对称模型 2 1.1. 业务分离法 2 1.2. App + db分布式分离法 2 2. 负载均衡算法 2 2.1.
  13. 图像增强--Retinex算法
  14. 自制QQ机器人插件笔记[nonebot2部署于ubuntu系统服务器]
  15. 编译bug can not be used when making a shared object; recompile with -fPIC
  16. 成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
  17. Java——通过Java代码从ftp服务器下载文件
  18. 【2018黑龙江省赛】UPC-7222 Overflow(模拟物理水体积)
  19. 每页多张幻灯片密集打印的设置技巧
  20. 检验方法的验证、确认步骤及详细计算方法

热门文章

  1. 15款业界公认的最佳视频处理软件
  2. 【汇正财经】有色金属,小金属价格新高
  3. Unity3D大型RPG游戏制作教程【高清】【中文字幕】
  4. Springboot-‘@Getter‘ not applicable to type,报错是因为没有引用lombok依赖
  5. SDNU 1027 马踏飞燕序
  6. openstack api_探索适用于PowerVC的OpenStack REST API
  7. 科普:跨链桥是如何被黑的?
  8. java面向对象1-面向对象概念
  9. CSS中li标签去除小圆点
  10. 【图片新闻】DARPA的新设想可能将海洋生物群体变成一个巨大的潜艇探测网络