C++ Day4 指针和结构体

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");
}
上一篇:千锋day4


下一篇:leetcode打卡day4