ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ Day4 指针和结构体

2021-01-09 19:04:29  阅读:176  来源: 互联网

标签:arr const People int Day4 C++ include 指针


C++ Day4 指针和结构体

一、指针

  • 通过指针可以间接访问内存。
  • 可以通过指针来保存一个地址。

1.1 定义和使用

  • 定义:数据类型 * 变量名。
  • 让指针记录地址。
#include<iostream>
using namespace std;
int main()
{
    int num1=20;
    int *p;//定义指针
    p=&num1;// 让指针记录地址
    cout<<"a的地址为:"<<&num1<<endl;
    cout<<"指针的值:"<<p<<endl;
    cout<<"使用指针:"<<*p<<endl;
    *p=100;
    cout<<"使用指针:"<<*p<<endl;
    system("pause");
}

1.2 指针所占的内存空间

  • 指针是一种数据类型。
32位操作系统64位操作系统
4字节(所有类型int */float */double *…)8字节(所有类型)

1.3 空指针

  • 定义:指针变量指向内存为0的空间,空指针指向的内存不可访问
  • 作用:初始化指针,int *p=NULL;
  • 0-255之间的内存是系统占用,不可访问。

1.4 野指针

  • 定义:指向非法的内存空间/不是我们自己申请的内存。
 	int *s=(int *)0x1124;
    cout<<"指针的值:"<<*s<<endl;//报错

1.5 const修饰的指针

  1. const修饰指针:常量指针,const ,int * p;指针指向的值不可改,指向的地址可以改
  2. const修饰常量:指针常量,int * const p;指针指向的值可改,指向的地址不可以改
  3. const既修饰指针又修饰常量。const int * const p;指针指向的值、指向的地址都不可以改

1.6 指针与数组

  • 使用指针访问数组中的元素。
#include<iostream>
using namespace std;
int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9};
    int *p=arr;
    for(int i=0;i<9;i++)
    {
        cout<<"第"<<i+1<<"数是"<<*p<<endl;
        p++;
    }
    system("pause");
}

1.7 指针与函数

  • 利用指针作为函数的参数
  • 地址传递,和值传递不同,地址传递可以改变实参的值
#include<iostream>
using namespace std;
void swap(int *p1,int *p2)
{
    int temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int main()
{
    int a=1;
    int b=2;
    swap(&a,&b);
    cout<<"a的值 "<<a<<endl;
    cout<<"b的值 "<<b<<endl;
    system("pause");
}

1.8 示例

  • 用指针,数组,函数实现冒泡排序。
#include<iostream>
using namespace std;

void print(int *arr,int len)//打印数组
{
    for(int i=0;i<len;i++)
    {
        cout<<arr[i]<<endl;
    }
}

void upsort(int * arr,int len)//冒泡排序函数 (int arr[],int len)也可
{
    for(int i=len-1;i>=0;i--)
    {
        for(int k=0;k<i;k++)
        {
            if(arr[k]>arr[k+1])
            {
                int temp=arr[k];
                arr[k]=arr[k+1];
                arr[k+1]=temp;
            }
        }
    }
    print(arr,len);
}
int main()
{
    int arr[]={1,2,5,68,4,6,45,7,3};
    int len=sizeof(arr)/sizeof(arr[0]);
    upsort(arr,len);
    system("pause");
}

二、结构体

  • 用户自己定义的数据类型。
  • 可以存储不同类型的数据。

2.1 定义和使用

  • 使用:struct 结构体名称 { 结构体成员列表 };
#include<iostream>
#include<string>
using namespace std;
struct People
{
    //string name;//一些编译器设置string name;在初始化时会崩溃
    char name[20]="小张";
    int age=1;
    int phone=23;
}s1;//第1种创建结构体变量的方法
int main()
{

    struct People s2 ={"小明",15,100};// 第二种方法

    struct People s3;//第三种方法
    s3.age=18;
    s3.phone=123456;
    cout<<s1.name<<"  年龄:"<<s1.age<<"电话:"<<s1.phone<<endl;
    cout<<s2.name<<"  年龄:"<<s2.age<<"电话:"<<s2.phone<<endl;
    cout<<s3.name<<"  年龄:"<<s3.age<<"电话:"<<s3.phone<<endl;    
    system("pause");
}

2.2 结构体数组

  • 将在定义的数组放入结构体中。
#include<iostream>
#include<string>
using namespace std;
struct People
{
    //string name;//一些编译器设置string name;在初始化时会崩溃
    char name[20];
    int age;
    int phone;
};
int main()
{
    struct People arr[3]
    {
        {"小明",1,2},
        {"小红",10,20},
        {"小李",100,200},
    };
    system("pause");
}

2.3 结构体指针

  • 通过指针访问结构体的成员。
    People s={"小明",1,2};
    People *p=&s;
    cout<<p->name<<p->age<<p->phone<<endl;
    system("pause");

2.4 结构体嵌套结构体

  • 结构体中的成员可以是其他的结构体。

2.5 结构体作为函数参数

  • 结构体作为参数向函数中传递。
  • 两种方式:值传递和地址传递。

2.6 结构中const使用场景

  • 防止错误操作,地址传递只占四个字节,将函数的形参改为指针可以减少占用空间,但会改变实参的值。
#include<iostream>
#include<string>
using namespace std;
struct People
{
    char name[20];
    int age;
    int phone;
};

void print(const People *p)
{
    //p->age=100;//错误操作
    cout<<p->name<<p->age<<p->phone<<endl;
}
int main()
{
    People s={"小明",1,2};
    People * p=&s;
    print(p);
    system("pause");
}

标签:arr,const,People,int,Day4,C++,include,指针
来源: https://blog.csdn.net/qq_43003160/article/details/112391000

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有