c++中重要的指针

指针变量是指存放地址的变量。因地址的改变而做出指定性质的衡量变法

目录

 

  1. 1 概述        
  2. 2 定义
  3. 3 区别

概述

存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。

举例:int a = 68 ,系统为变量a分配的首地址为0X065FDF4H,声明空指针long *p = NULL,p=&a是存放变量a地址的指针变量,即p=&a中存放的值为0x065FDF4H(a的值为68,&a的值为0x065FDF4H)。

对变量a的访问有两种方式:一是直接按地址0x065FDF4H找到a的存储单元,从而对变量a进行访问;二是按系统为p=&a分配的地址先找到p=&a,然后根据p,&a的值(即变量a地址0x065FDF4H)找到变量a在内存中的存储单元,从而对变量a进行访问。对于前一种访问方式称为直接访问方式,后一种访问方式称为间接访问方式。

如果一个指针变量存放的是某个对象的地址,则称这个指针变量指向该对象。在C++程序设计中,指针变量只有确定了指向才有意义。

定义

1. 定义指针变量的一般形式如下:

类型名*指针变量名1,*指针变量名2,... *指针变量名n ;

2. 空指针

空指针是一个特殊的指针,它的值是0,C语言中用符号常量NULL(在stdio.h中定义)表示这个空值,并保证这个值不会是任何变量的地址。空指针对任何指针类型赋值都是合法的。一个指针变量具有空指针值表示当前它没有指向任何有意义的东西。

3. void指针

(void *)类型的指针叫通用指针,可以指向任何的变量,C语言允许直接把任何变量的地址作为指针赋给通用指针。但是需要注意void*不能指向由const修饰的变量,例如const int test; void * ptv; ptv = &test;第三句是非法的,只有将ptv声明为const void * ptv;,上述第三句ptv = &test才是合法的。

当需要使用通用指针所指的数据参加运算时,需要写出类型强制转换。如通用指针ptv 所指空间的数据是整形数据,p是整型指针,用此式转换:p=(int *)ptv;

区别

指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数据的处理更方便,使程序的书写简洁,高效,清爽。但由于指针对初学者来说,难于理解和掌握,需要一定的计算机硬件的知识做基础,这就需要多做多练,多上机动手,才能在实践中尽快掌握,成为C的高手。

过去,我们在编程中定义或说明变量,编译就为已定义的变量分配相应的内存单元,也就是说,每个变量在内存会有固定的位置,有具体的地址。由于变量的数据类型不同,它所占的内存单元数也不相同。若我们在程序中做定义为:

int a=1,b=2;

float x=3.4, y = 4.5 ;

double m=3.124;

char ch1='a', ch2='b';

让我们先看一下编译系统是怎样为变量分配内存的。变量a,b是整型变量,在内存各占2个字节;x,y是实型,各占4个字节;m是双精度实型,占8个字节;ch1,ch2是字符型,各占1个字节。由于计算机内存是按字节编址的,设变量的存放从内存2000单元开始存放,则编译系统对变量在内存的安放情况。

变量在内存中按照数据类型的不同,占内存的大小也不同,都有具体的内存单元地址,如变量a在内存的地址是2000,占据两个字节后,

变量b的内存地址就为2002,变量m的内存地址为2012等。对内存中变量的访问,过去用scanf("%d%d%f",&a,&b,&x)表示将数据输入变量的地址所指示的内存单元。那么,访问变量,首先应找到其在内存的地址,或者说,一个地址唯一指向一个内存变量,我们称这个地址为变量的指针。如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针对所指向变量的访问,也就是一种对变量的“间接访问”。

设一组指针变量pa、pb、px、py、pm、pch1、pch2,分别指向上述的变量a、b、x、y、m、ch1、ch2,指针变量也同样被存放在内存,尽管所指向的变量类型不同,但是这些指针变量所占内存空间都是2个字节,而与所指向变量的类型无关。二者的关系如图1所示:

在图1中,左部所示的内存存放了指针变量的值,该值给出的是所指变量的地址,通过该地址,就可以对右部描述的变量进行访问。如指针变量pa的值为2000,是变量a在内存的地址。因此,pa就指向变量a。变量的地址就是指针,存放指针的变量就是指针变量。

加上sort会更好。

sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#include<algorithm>的c++标准库中。

下面来练几道吧!

1.

题目描述

巅峰小学举行1分钟跳绳比赛,n人一组。试编一程序,输入小组内同学的跳绳次数,按次数由多到少的顺序输出。

输入描述

第1行为 n。n≤100。

第2行为 n 个正整数,其间用空格间隔。

输出描述

一行,由多到少的排序的结果。

答案:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> 
#include<algorithm>
using namespace std;
int cmp(int a,int b){
    return a>b;    
}
int main(){
    int n,a[105];
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    
     return 0;
}

2.

题目描述

考试结束后,同学们的成绩都不一样,知道了学生的考号以及分数,找出谁是第N名

输入描述

第一行有两个整数,分别是学生的人数m(1≤m≤100),和求第N名学生的(1≤N≤m)。 其后有m行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。

输出描述

输出第N名学生的学号和成绩,中间用空格分隔。

(请以指针来完成)

答案:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> 
#include<algorithm>
using namespace std;
struct student{
    int name;
    double score;
}stu[105];

int cmp(student a,student b){
    return a.score>b.score;    
}

int main()
{
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=m;i++){
        cin>>stu[i].name>>stu[i].score;
    }
    sort(stu+1,stu+1+m,cmp);
    cout<<stu[n].name<<" "<<stu[n].score;
     return 0;
}

猜你喜欢

转载自blog.csdn.net/ruirui118/article/details/120275815