学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

学习日记

目录

学习日记

前言

一、指针的概念

二、指针变量

注意

1、怎样定义指针变量

2、怎样引用指针变量

注意

3、指针变量作为函数参数

例 1

例2

C语言指针操作


前言

指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。

一、指针的概念

如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。内存区的每一个字节有一个编号,这就是“地址”。

 由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元,将地址形象化地称为“指针”。

C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,或者说它是“带类型的地址”。

存储单元的地址和存储单元的内容是两个不同的概念。 在程序中一般是通过变量名来引用变量的值。 直接按变量名进行的访问,称为“直接访问”方式。还可以采用另一种称为 “间接访问”的方式,即将变量的地址存放在另一变量(指针变量)中, 然后通过该指针变量来找到对应变量的地址,从而访问变量。

int i=1,j=2,k=3;
//设int变量占2字节

二、指针变量

通过指针变量访问整型变量。

#include <stdio.h>
int main()
{   int a=100,b=10;//定义整型变量a,b,并初始化int *pointer_1,*pointer_2;//定义指向整型数据的指针变量pointer_1, pointer_2pointer_1=&a; //把变量a的地址赋给指针变量pointer_1pointer_2=&b;  //把变量b的地址赋给指针变量pointer_2 printf("a=%d,b=%d\n",a,b); //输出变量a和b的值printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2);//输出变量a和b的值return 0;
}

*pointer_1;    //企图定义pointer_1为指针变量。出错

int *pointer_1;    //正确,必须指定指针变量的基类型

注意

定义指针变量时,左侧应有类型名,否则就不是定义指针变量。

1、怎样定义指针变量

类型名 *指针变量名;——————int *pointer_1, *pointer_2;

左端的int是在定义指针变量时必须指定的“基类型”。指针变量的基类型用来指定此指针变量可以指向的变量的类型。 前面介绍过基本的数据类型(如int,char,float等),既然有这些类型的变量,就可以有指向这些类型变量的指针,因此,指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在。

在定义指针变量时要注意:

(1) 指针变量前面的“*”表示该变量为指针型变量。指针变量名则不包含“*”。

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

(3) 如何表示指针类型。指向整型数据的指针类型表示为“int *”,读作“指向int的指针”或简称“int指针”。

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

2、怎样引用指针变量

1、给指针变量赋值。

2、 引用指针变量指向的变量。

3、引用指针变量的值。

int a, *p;
p=&a;              //把a的地址赋给指针变量p                                                      ①
printf("%d",*p);      //以整数形式输出指针变量p所指向的变量的值,即a的值                          ②
*p=1;              //将整数1赋给p当前所指向的变量,由于p指向变量a,相当于把1赋给a,即a=1  ②
printf("%o",p);       //以八进制形式输出指针变量p的值,由于p指向a,相当于输出a的地址,即&a ③

注意

要熟练掌握两个有关的运算符:

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

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

输入a和b两个整数,按先大后小的顺序输出a和b。

#include <stdio.h>
int main()
{   int *p1,*p2,*p,a,b;                 //p1,p2的类型是int *类型printf("please enter two integer numbers:");scanf("%d,%d",&a,&b);             //输入两个整数 p1=&a;                            //使p1指向变量ap2=&b;                           //使p2指向变量bif(a<b)                            //如果a<b{ p=p1;p1=p2;p2=p;}            //使p1与p2的值互换printf("a=%d,b=%d\n",a,b);          //输出a,bprintf("max=%d,min=%d\n",*p1,*p2);   //输出p1和p2所指向的变量的值return 0;
}

a和b的值并未交换,它们仍保持原值,但p1和p2的值改变了。

实际上,第9行可以改为{p1=&b; p2=&a;}即直接对p1和p2赋以新值,这样可以不必定义中间变量p,使程序更加简练。

3、指针变量作为函数参数

函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。

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

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

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

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

4、在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值;

5、主调函数中就可以使用这些改变了值的变量。

例 1

对输入的两个整数按大小顺序输出。(不能企图通过改变指针形参的值而使指针实参的值改变)

#include <stdio.h>
int main()
{   void swap(int *p1,int *p2);int a,b;int *pointer_1,*pointer_2;   //pointer_1,pointer_2是int *型变量printf("please enter two integer numbers:");scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b) swap(pointer_1,pointer_2);//调用swap函数,用指针变量作实参printf("max=%d,min=%d\n",*pointer_1,*pointer_2);return 0;
}void swap(int *p1,int *p2)     //形参是指针变量
{   int *p;p=p1;               //下面3行交换p1和p2的指向p1=p2;p2=p;
}

例2

输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。

#include <stdio.h>
int main()
{   void exchange(int *q1, int *q2, int *q3);   //函数声明int a,b,c,*p1,*p2,*p3;printf("please enter three numbers:");scanf("%d,%d,%d",&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf("The order is:%d,%d,%d\n",a,b,c);return 0;
}void exchange(int *q1, int *q2, int *q3) //将3个变量的值交换的函数
{   void swap(int *pt1, int *pt2);  //函数声明if(*q1<*q2) swap(q1,q2);       //如果a<b,交换a和b的值if(*q1<*q3) swap(q1,q3);        //如果a<c,交换a和c的值if(*q2<*q3) swap(q2,q3);        //如果b<c,交换b和c的值
}void swap(int *pt1, int *pt2)      //交换2个变量的值的函数
{   int temp;temp=*pt1;                //交换*pt1和*pt2变量的值*pt1=*pt2;*pt2=temp;
}

C语言指针操作

C语言指针操作(一)指针变量

C语言指针操作(二)通过指针引用数组

C语言指针操作(三)*通过指针引用多维数组

C语言指针操作(四)通过指针引用字符串

C语言指针操作(五)*指向函数的指针

C语言指针操作(六)*返回指针值的函数

C语言指针操作(七)*指针数组和多重指针

C语言指针操作(八)*动态内存分配与指向它的指针变量

C语言指针操作(一)指针变量相关推荐

  1. C语言指针操作(四)通过指针引用字符串

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 学习日记 前言​编辑 一.字符串的引用方式 例1 例2 二.字符指针作函数参数 用函数调用实现字符串的 ...

  2. C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针

    const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...

  3. 面试准备每日五题:C++(五)——野指针、句柄指针、newdeletemallocfree、extern、类成员权限

    文章目录 1. 如何避免"野指针" 2. 句柄和指针的区别和联系是什么? 3. new/delete与malloc/free的区别是什么 4. 说一说extern"C&q ...

  4. 关于零指针、NULL、空指针、vold*指针和野指针的总结

    1. 零指针 零值指针,是值为0的指针,可以是任何一种指针类型,可以是通用变体类型void*,也可以是char*,int*等等. 在C++里面,任何一个概念都要以一种语言内存公认的形式表现出来,例如s ...

  5. 指针辨析:悬垂指针、哑指针、野指针、智能指针

    原文地址:https://blog.csdn.net/zhaojinjia/article/details/8770989 悬垂指针: 1:提出的原因: 请看下面的代码片段: int *p=NULL; ...

  6. 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )

    文章目录 前言 一.数组符号 [] 与 指针 * 符号 使用效果 基本等价 二.数组首地址 与 指针 本质区别 前言 参考 [C 语言]指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方 ...

  7. C语言笔记含源码(变量、输入输出、分支、循环、函数、数组、指针、字符串、结构体)小总结

    文章目录 一.变量与输入输出 二.分支语句 三.循环 四.函数 五.数组 六.指针 七.字符串 八.结构体 一.变量与输入输出 定义变量需要:类型.变量名.变量值(可有可无) #include < ...

  8. c语言如何用指针操作一维字符数组,C语言中数组和指针的互操作

    C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减.当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有 ...

  9. 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )

    文章目录 一.指针运算 与 指针内存操作 二.结构体偏移量计算 一.指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等 ...

最新文章

  1. 对order by的理解
  2. android之实现各个组件点击事件监听
  3. 净水器选购指南,如何挑选家用净水器
  4. Maven学习总结(14)——Maven 多模块项目如何分工?
  5. Spring MVC 配置--解剖
  6. 打印菱形星号组合C程序
  7. 程序员面试金典 - 面试题 08.13. 堆箱子(DP)
  8. java 异步调用 shell_Java 实现异步调用
  9. linux 查看主机版本,Linux下如何查看版本信息的方法步骤
  10. Bootstrap响应式工具类
  11. 鸿蒙系统速度和ios,鸿蒙系统到底和苹果安卓有什么区别
  12. mysql主从与读写分离_MySQL主从复制与读写分离
  13. 百度浏览器内核太低,浏览京东有问题
  14. 【招】阿里云技术战略高级专家
  15. 平方符号在python中的作用_python平方符号
  16. 计算机分区gpt无法启动项,双系统引导失败怎么修复?用bcd编辑MBR/GPT教程
  17. 微信内无法分享转发网址链接,谈谈微信网址防屏蔽的办法
  18. 快速识别区块链中的骗局
  19. TM1637数码管显示 HAL库
  20. Gromacs(三) NPT平衡

热门文章

  1. 子网划分和子网掩码的计算方法
  2. CPETA(中国宠物协会的简称 )会员有什么用?
  3. 多卡聚合技术在消防应急可视化指挥视频传输的应用
  4. 垃圾3D打印机Makerbot Replicator Z18 常见报错
  5. 有 Docker 谁还在自己本地安装 Mysql ?
  6. 轻量级 读写锁(SRW)
  7. Arduino UNO 单片机 读RFID RC522卡号发送Json数据
  8. java bo代表什么_Java学习入门-08 -基本概念--PO、VO、DAO、BO、POJO
  9. JavaWeb - 我们的开发规范(VO、DTO、BO、PO、DO、POJO)
  10. java万年历uml_Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口...