C++基础教程(五)——指针(2)

简介: //=====================================================// Name : Pointer1.
//=====================================================
// Name        : Pointer1.cpp
// Author      : lf
// Version     : 《C++语言基础教程》 吕凤翥 P38——P43 2.5.2
// Description : 指针和数组
// Tips        :
// 在C++中,数组的元素可以用下标表示,也可以用指针表示.
// 但是最好是用指针表示,因为指针表示要比下标表示处理起来要快.
// 所以在C++中尽量使用指针来引用数组元素
//=====================================================

#include <iostream>
using namespace std;

int main() {
	cout<<"<----数组元素的指针表示---->"<<endl;
	int a[5]={3,4,5,6,7};
	//一维数组元素下标表示方法
	//a[i],其中i=0,1,2,3,4
	//一维数组元素指针表示法
	//*(a+i),其中i=0,1,2,3,4
	int number1=*(a+2);
	cout<<"number1="<<number1<<endl;
	cout<<"--------------------------"<<endl;

	//二维数组元素下标表示方法
    //b[i][j],其中i=0,1;j=0,1,2,3,4
	//二维数组元素指针表示法
	//*(*(b+i)+j),其中i=0,1;j=0,1,2,3,4
	int b[2][5]={{1,2,3,4,5},{6,7,8,9,0}};
	int number2=*(*(b+1)+1);
	cout<<"number2="<<number2<<endl;

	//将二维数组元素的行用下标表示,列用指针表示的形式:
	//*(b[i]+j)
    int number3=*(b[1]+1);
    cout<<"number3="<<number3<<endl;

    //将二维数组元素的列用下标表示,行用指针表示的形式:
    //(*(b+i))[j]
    int number4=(*(b+1))[2];
    cout<<"number4="<<number4<<endl;

    //按二维数组各个元素在内存的存放的顺序,用指向数组首元素的一级指针的表示形式:
    //*(&b[0][0]+5*i+j)
    int number5=*(&b[0][0]+5*1+3);
    cout<<"number5="<<number5<<endl;
    cout<<"--------------------------"<<endl;

    static int f[5]={5,4,3,2,1};
    int i,j;
    i=f[0]+f[4];
    j=*(f+2)+*(f+4);
    cout<<"i="<<i<<",j="<<j<<endl;
    cout<<"--------------------------"<<endl;

    static char s1[]="abcde";
    static char s2[5]={'m','n','p','q','\0'};
    char *ps=s1;
    //输出一个字符串时,可使用字符数组名或指向该字符串首地址的指针名
    cout<<"s1="<<s1<<",s2="<<s2<<endl;
    //注意这里的*ps+2,*ps指向的是字符a所以在执行*ps+2会把字符转换为整型即字符a对于的ASCII码97,所以结果为99
    cout<<"*ps="<<*ps<<",*(ps+2)="<<*(ps+2)<<",*(ps+4)="<<*(ps+4)<<",*ps+2="<<*ps+2<<endl;
    //同理
    char charc='c';
    cout<<"charc+2="<<charc+2<<endl;
    cout<<"--------------------------"<<endl;

    static int e[][3]={{1,2,3},{4},{5,6}};
    e[0][2]=7;
    e[1][2]=8;
    //形成数组:
    // 1 2 7
    // 4 0 8
    // 5 6 0
    // 指针分析:
    // *e指向了数组e的第一个元素{1,2,3},所以**e指向了{1,2,3}的第一个元素为1
    // *(e+1)指向了数组e的第二个元素{4,0,8},所以**(e+1)指向了{4,0,8}的第一个元素为4
    // *(e+1)指向了数组e的第二个元素{4,0,8},所以*(*(e+1)+2)指向了{4,0,8}的第三元素为8
    cout<<"**e="<<**e<<",**(e+1)="<<**(e+1)<<",*(*(e+1)+2)="<<*(*(e+1)+2)<<endl;

    cout<<"e[0][2]="<<e[0][2]<<",e[1][2]="<<e[1][2]<<",e[2][2]="<<e[2][2]<<endl;
	return 0;
}

相关文章
|
3月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
121 1
|
4月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
289 4
|
5月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
5月前
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
138 1
|
5月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
147 1
|
5月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
690 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
5月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
78 2
|
5月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
3天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
29 6
|
21天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。