IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言程序设计(第七章 指针) -> 正文阅读

[C++知识库]C语言程序设计(第七章 指针)

C语言程序设计(第七章 指针)

一、指针是什么

由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化地称为“指针”。意思就是通过它能找到以它为地址的内存单元。

假如有输入语句:
scanf("%d",&x);
k=x+y;

这种直接按变量名进行的访问,称为**“直接访问”**方式

还可以采用**“间接访问”**的方式,即将变量i的地址存放在另一个变量中,然后通过该变量来找到变量i的地址,从而访问i变量。

i_pointer=&i

(1)将3直接送到变量i所标识的单元中,例如“i=3”。

(2)将3送到变量i_pointer所指向的单元(即变量i的存储单元),例如“* i_pointer=3;”,其中* i_pointer表示i_pointer指向的对象。

指向就是通过地址来体现的,由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元(如同说,一个房间号指向一个房间一样),将地址形象化地称为“指针”。
如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”,指针变量就是地址变量,用来存放地址,指针变量的值是指针

二、指针变量

1、使用指针变量的例子

例题1:通过指针变量访问整型变量
#include<stdio.h>
int main(){
    int a=100,b=200;                             //定义整型变量a,b,并初始化
    int * pa,* pb;								 //定义指向整形数据的指针变量pa,pb
    pa=&a;										 //把变量a的地址赋给指针变量pa
    pb=&b;										 //把变量b的地址赋给指针变量pb 
    printf("a=%d,b=%d\n",a,b);					 //输出变量a和b的值
    printf("* pa=%d,* pb=%d\n",* pa,* pb);		 //输出变量a和b的值
    return 0;
}

执行结果:
a=100,b=200
* pa=100,* pb=200

2、怎样定义指针变量

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

int  *pa,*pb;
float * pc;
char * pd;

可以在定义指针变量时,同时对它初始化,如:
int * pa=&a,* pb=&b           //定义指针变量pa,pb,并分别指向a,b
一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址,二是它指向的存储单元的数据类型(如 int,char,float等)。
指向整型数据的指针表示为“ int *”,读作“指向int的指针”或简称“int 指针”。

3、怎样引用指针变量

在引用指针变量时,可能有三种情况:
(1)给指针变量赋值,如:
p=&a					//把a的地址赋给指针变量p

指针变量p的值是变量a的地址,p指向a

(2)引用指针变量指向的变量

如果已经执行(1)的操作,即指针变量p指向了整型变量a,则

printf("%d",* p);

其作用是以整数形式输出指针变量p所指向的变量的值,即变量a的值。

如果有以下赋值语句:

* p=1;

表示将整数1赋给p当前所指向的变量,如果p指向变量a,则相当于把1赋给a,即”a=1“。

(3)引用指针变量的值,如
printf("%o",p);

作用是以八进制数形式输出指针变量p的值,如果p指向了a,就是输出了a的地址,即&a

& 取地址运算符

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

例题2:输入a和b两个整数,按先大后小的顺序输出a和b
#include<stdio.h>
int main(){
    int * pa,* pb,* pc,a,b;
    printf("请输入两个整数:\n");
    scanf("%d,%d",&a,&b);
    pa=&a;
    pb=&b;
    if(a<b){
        pc=pa;
        pa=pb;
        pb=pc;
    }
    printf("a=%d,b=%d\n",a,b);
    printf("max=%d,min=%d\n",* pa,* pb);
    return 0;
}

执行结果:
请输入两个整数:
4,5
a=4,b=5
max=5,min=4

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

例题3:输入a和b两个整数,对输入的两个整数按大小顺序输出,用函数处理,而且用指针类型的数据作函数参数。
#include<stdio.h>
int main(){
    void swap(int * pa,int * pb);
    int a,b;
    int * p1,* p2;
    printf("请输入两个整数:\n");
    scanf("%d,%d",&a,&b);
    p1=&a;
    p2=&b;
    if(a<b){
        swap(p1,p2);
    }
    printf("max=%d,min=%d\n",a,b);
    return 0;
}

void swap(int * pa,int * pb){
    int temp;
    temp=* pa;
    * pa=* pb;
    * pb=temp;
}

执行结果:

请输入两个整数:
5,6
max=6,min=5
例题4:输入3个整数a,b,c,要求按大到小的顺序将它们输出。用函数实现。
#include<stdio.h>
int main(){
    void swaps(int * pa,int * pb,int * pc);
    int a,b,c,* p1,* p2,* p3;
    printf("请输入三个整数:\n");
    scanf("%d,%d,%d",&a,&b,&c);
    p1=&a;p2=&b;p3=&c;
    swaps(p1,p2,p3);
    printf("the order is:%d,%d,%d\n",a,b,c);
    return 0;
}

void swaps(int * pa,int * pb,int * pc){
    void swap(int * q1,int * q2);
    if(* pa<* pb) swap(pa,pb);
    if(* pa<* pc) swap(pa,pc);
    if(* pb<* pc) swap(pb,pc);
}

void swap(int * q1,int * q2){
    int temp;
    temp=* q1;
    * q1=* q2;
    * q2=temp;
}

执行结果:

请输入三个整数:
9,5,10
the order is:10,9,5

4、通过指针引用数组

所谓数组元素的指针就是数组元素的地址,可以用一个指针变量指向一个数组元素。例如:
int a[10]={1,3,5,7,9,11,13,15,17,19};
int * p;
p=&a[0];

引用数组元素可以用下标法(如 a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。

在指针已指向一个数组元素时,可以对指针进行以下运算:

加一个整数(用+或+=),如p+1;

减一个整数(用-或-=),如p-1;

自加运算,如p++,++p;

自减运算,如p–,--p;

两个指针相减,如p1-p2(只有当p1和p2都指向同一个数组中的元素才有意义)

p+1指向同一个数组中的下一个元素,p-1指向同一个数组中的上一个元素

引用一个数组元素,可以用下面两种方法:

(1)下标法,如a[i]形式;

(2)指针法,如* (a+1)或* (p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值p=a

例题5:通过指针变量输出整型数组a的十个元素。
#include<stdio.h>
int main(){
    int i,a[10],* p=a;
    printf("请输入10个整数:");
    for(i=0;i<=9;i++)
        scanf("%d",p++);
    p=a;
    for(i=0;i<=9;i++,p++){
        printf("%d\t",* p);
    }
    printf("\n");
    return 0;
}

执行结果:
请输入10个整数:0 1 2 3 4 5 6 7 8 9
0       1       2       3       4       5       6       7       8       9

5、用数组名作函数参数

字符串的引用方式:
例题6:将字符串a复制为字符串b,然后输出字符串b。
#include<stdio.h>
int main(){
    char a[]="I am a student.",b[20];
    int i;
    for(i=0;* (a+i)!='\0';i++){
        * (b+i)=* (a+i);
    }
    * (b+i)='\0';
    printf("string a is: %s\n",a);
    printf("string b is:");
    for(i=0;b[i]!='\0';i++){
        printf("%c",b[i]);
    }
    printf("\n");
    return 0;
}

执行结果:

string a is: I am a student.
string b is: I am a student.
    
    
#include<stdio.h>
int main(){
    char a[]="I am a boy.",b[20],* p1,* p2;
    p1=a;p2=b;
    int i;
    for(;* p1!='\0';p1++,p2++){
        * p2=* p1;
    }
    * p2='\0';
    printf("string a is: %s\n",a);
    printf("string b is: %s\n",b);
    return 0;
}

执行结果:

string a is: I am a boy.
string b is: I am a boy.
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 00:58:09  更:2022-02-19 01:00:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:42:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码