C++学习文档 — 指针

1.9 指针

一、指针的定义与使用

1.什么是地址

程序运行中的每一个变量都分配有一块内存空间,对应的内存的起始编号称为这个变量的地址。

2.数据访问的两种方式

  • 直接访问:程序通过变量名来访问这块空间中的数据的访问方式。
  • 间接访问:通过指针变量来访问它所存的变量的方式。
    • 指针变量保存另一个变量地址的变量。

3.指针变量的定义格式

一级指针的定义:数据类型 *变量名;

二级指针的定义:数据类型 **变量名;

三级指针的定义:数据类型 ***变量名;

程序举例:一级指针的简单应用

int main()
{
   int num1 = 3; 
   int *pointer = &num1;  //定义整型变量的指针,并初始化指针变量的地址为num1的地址
   cout << "num1=" << num1 << "\tnum1:address=" << &num1 << endl;
   cout << "pinter=" << pointer << "\tpoint:address=" << &pointer 
   cout<< "  *pointer=" << *pointer << endl;
   system(“pause”);
   return 0;
}

二、指针变量的基本操作

1.指针变量初始化赋值的语法格式

数据类型 *指针类型 = 另一个变量初始地址的表达式

2.指针变量赋值

指针变量名 = 地址表达式

3.其他运算

取值运算:*

算术运算:+n , -n

相减运算:p1 - p2

比较运算:p1 < p2

4.程序举例

#include<iostream>
#include<iomanip>
using namespace std;

void output(int *arr, int n);
int main()
{
    int intArray[] = { 1, 2, 3, 4, 5 };
    int n = sizeof(intArray) / sizeof(intArray[0]);
    output(intArray, n);//数组名作函数的参数
    int *pPointer = intArray;
    int i = 0;
    while (pPointer<intArray + n)//指针的+n运算
    {
        *pPointer = i * 2 + 1;
        pPointer++;//指针的++运算
        i++;
    }
	
    pPointer = intArray;
    output(pPointer, n);//指针作函数的能数

    system("pause");
    return 0;
}

//倒序输出数组元素值
void output(int *arr, int n)
{    
    int *p;
    p = arr + n - 1;//指向数组元素的指针
    for (; p >= arr; p--)//指针--运算
    cout << setw(3) << *p;
    cout << endl;
}

三、动态内存分配

1.运行程序的内存空间分为5个区

全局数据区(data area)

代码区(code arae)

栈区(stack area)

堆区(heap area)

字符常量区

2.程序运行过程中才能确定数据大小时,这个时候需要根据问题的规模动态分配

3.动态地址分配内存new 运算符

  • 指针变量名 = new 类型名(初值列表);
  • 指针变量名 = new 类型名 [下标表达式];(数组)
  • 指针变量名 = new 类型名 [下标表达式1] [下标表达式2] […];

4.内存释放delete 运算符

  • delete 指针变量名;
  • delete []指针变量名;(数组)

5.程序举例

int *NewArray(int n); //动态申请一维数组的内存空间
void output(int *arr, int n); //显示数组元素的值

int main()
{     
    int n;
    cout << "输入动态数组的长度:" << endl;
    cin >> n;
    int *array = NewArray(n);
    for (int i = 0; i<n; i++)
    {   
        array[i] = i; 
    }
    output(array, n);
    delete[]array;
    system("pause");
    return 0;
}
//动态申请一维数组的内存空间
int *NewArray(int n)
{     
    int *p;
    p = new int[n];
    return p;
}
//显示数组元素的值
void output(int *arr, int n)
{     
    int *pointerArr = arr;
    for (; pointerArr<arr + n; pointerArr++)
    {  
        cout << "   " << *pointerArr;
    }
    cout << endl;
}

四、指针与函数

1.指针做函数的参数

  • 指针做函数的参数是一种地址传递方式。
  • 指针可以作为函数的形参,也可以作为函数的实参。
  • 实参和形参指针变量指向同一内存地址实现参数双向传递。(不是指针做形参的函数都是单向传递!)

2.指针函数:指针类型的函数

  • 函数声明其返回值为指针类型时,这个函数就称为指针函数。

  • 主要目的:在函数结束调用结束时,把大量的数据从被调用函数返回到主函数。

  • 指针函数的定义

    数据类型 *函数名 (参数表)

    {

    ​ 函数体

    }

3.函数指针:用来存储函数的入口地址的指针变量

  • 函数指针定义格式

    返回类型 (*函数指针名)(形参表);

  • 函数指针的赋值

    函数指针名 = 函数名

  • 调用函数指针指向的函数

    函数指针名 (实参表);

4.程序举例

#include<iostream>
#include<string>
using namespace std;
 
#define FUN_MAX 0
#define FUN_MIN 1
#define SIZE sizeof(map)/sizeof(fun_map)
 
string menu[] = { "计算两数的最大值,输入0","计算两数的最小值,输入1" };
int max(int x, int y);
int min(int x, int y);
void dispMenu(string menu[], int n);
struct fun_map
{
    int msg;	
    int(*pfn)(int, int); //定义指向函数的指针作结构体的成员
}; 
int main()
{
    int a, b, m;
    int sel;
    //定义fun_map类型的数组并初始化
    fun_map map[] = { FUN_MAX, &max, FUN_MIN, &min };
    //map[0].msg=0;map[0].pfn=&max;
    //map[1].msg=1;map[1].pfn=&min;
    int lenMenu = sizeof(menu) / sizeof(menu[0]);
    for (int i = 0; i<SIZE; i++)
    {    
        cout << "输入a,b的值:" << endl;
        cin >> a >> b;
        dispMenu(menu, lenMenu);
        cin >> sel;
        if (sel == map[i].msg)
        	m = map[i].pfn(a, b);
        cout << "m=" << m << endl;
    }
    system(“pause”);   
    return 0;
}

int max(int x, int y)
{     
    return (x>y ? x : y);
}

int min(int x, int y)
{    
    return (x<y ? x : y);
}
 
void dispMenu(string menu[], int n)
{    
    for (int i = 0; i < n; i++)
        cout << menu[i] << endl;
    cout << endl;
}

五、指针数组

1.定义:数组元素为指针的数组

2.一维指针数组的定义形式

数据类型 *数组名 [数组元素的个数];

3.使用方式

作为函数的参数

用于指向若干字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C基础上[2],一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。C++目前流行的编译器最新版本是Borland C++ 4.5,Symantec C++ 6.1,和Microsoft Visual C++ 2012。C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。 C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准。 C++ 1998年国际标准组织(international standard organization, ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1988-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。 1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准。C++0x最终国际投票已于2011年8月10日结束,并且所有国家都投出了赞成票,C++0x已经毫无疑义地成为正式国际标准。先前被临时命名为C++0x的新标准将被称为C++ 2011。C++ 2011取代现行的C++标准ISO/IEC 14882,它公开于1998年并于2003年更新,通称C++98以及C++03。国际标准化组织于2011年9月1日出版发布ISO/IEC 14882:2011,名称是:Information technology -- Programming languages -- C++ Edition: 3。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackson Xi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值