c++基础(三)结构体,malloc,形参实参。指针的研究

100 阅读4分钟

1. 结构体

1.1 定义:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

image.png

typeof struct{
   属性列表; 
}别名 ;

image.png

image.png

typedef 查看链接

#include <iostream>
#define MaxSize 10
using namespace  std;

typedef struct {
	int age;
	double height;
} Person,*PPerson,Persons[MaxSize];


int main() {
	
	Person p;//Person 定义普通类型

	PPerson pp=&p; //PPseron定义指针类型,	PPerson pp=&p 等价于 Person *pp1=pp;
	Person *pp1=pp;

	Persons ps;//定义数组类型  等价于	Persons ps1[MaxSize];
	cout<<sizeof(ps)/sizeof(Person)<<endl;//等价于 Person ps1[MaxSize]; 10
	
	Person ps1[MaxSize];//定义数组类型
	cout<<sizeof(ps1)/sizeof(Person)<<endl;
	return 0;
}

1.2.结构体的访问

通过结构体变量名和成员名使用“.”操作符进行访问,例如:

struct Student s1;
s1.score = 94;
strcpy(s1.name, "lzy");
s1.age = 20;

通过指向结构体的指针使用“->”操作符进行访问,例如:

struct Student* ps1;
ps1 = &s1;
ps1->score = 94;
strcpy(ps1->name, "lzy");
ps1->age = 20;

例子:

#include <iostream>
#define MaxSize 10
using namespace  std;
typedef struct {
	int age;
	double height;
} Person,*PPerson,Persons[MaxSize];

void print(Person p) {
	cout<<p.age<<','<<p.height<<endl;
}
int main() {

	Person p;//Person 定义普通类型

   //1. 普通类型访问
	p.age=10;
	p.height=1.80;
	print(p);
   //2. 指针类型访问
	PPerson pp=&p; //PPseron定义指针类型,	PPerson pp=&p 等价于 Person *pp1=pp;
   //	Person *pp1=pp;
	pp->age=99;
	pp->height=1.88;
	print(*pp);//加 * 解引用 ,把内存中的值,拿出来。
	return 0;
}

1.3. 数组

  1. 普通形式 image.png
#include <bits/stdc++.h>
#define MaxSize 10
using namespace  std;

typedef struct {
	int age;
	double height;
} Person,*PPerson,Persons[MaxSize];

void print(Person p) {
	cout<<p.age<<','<<p.height<<endl;
}
int main() {
	Persons ps;
	ps[1].age=11;
	ps[1].height=1.9;
	 print(ps[1]);
	return 0;
}
  1. 结构体指针

image.png 结构体中用到自己本身

image.png

2. malloc

void * malloc(int size);

说明:

  • malloc 向系统申请分配指定size个字节的内存空间。
  • 返回类型是 void* 类型。void* 表示未确定类型的指针。
  • C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
#include <bits/stdc++.h>
#define MaxSize 10
using namespace std;

typedef struct Person
{
    char *name;
    int age;
    double height;
    struct Person *mate;              // 配偶
} Person, *PPerson, Persons[MaxSize]; // Persons 数组中每一个数组的元素类型都Person
void print(Person p)
{
    cout << "姓名:" << p.name << " 年龄:" << p.age << " 身高" << p.height << endl;
}
int main()
{
    // PPerson和Person * 是等价的
    PPerson pp = (Person *)malloc(sizeof(Person));
    pp->age = 20;
    pp->name = (char *)"钱哥哥";
    pp->height = 1.8;
    print(*pp);
    free(pp); // 释放内存
    return 0;
}

3. 形参和实参

  1. 没有取地址

image.png 2. 取地址

image.png 3. 实参形参的同步改变

image.png ps:

  • ++i,返回i+1之后的值
  • i++,返回i+1之前的值

4 两数交换

image.png

5. 函数演示研究指针变量本身,还是在研究指针变量所指向的储存指向的存储空间的问题。

  1. 基本思路 黄金重点理解

image.png

#include <bits/stdc++.h>
#define MaxSize 10
using namespace std;

// 实参a传递给形参b的过程: 把a储存的地址值,复制一份交给了b

void test(int *b)
{
    *b = 10;  // 对b进行解引用,修改b所指向那个块的存储地址里面的值,修改为10
    b = NULL; // 将b这个变量本身存储的值改为NULL
}
int main()
{
    int *a = (int *)malloc(sizeof(int));
    *a = 11;
    cout << a << endl;  // 打印a储存的地址值
    cout << *a << endl; // 打印a储存的地址值里面,所对应的那个值
    
    // 实参a传递给形参b的过程: 把a储存的地址值,复制一份交给了b
    test(a);            // 相当于int *b = a;  //a和b各自的储存空间不同,但是他们储存的地址相同。

    cout << a << endl;
    cout << *a << endl;
    return 0;
}

a和b共享用一个空间

image.png

6. 递归

1.递归算法:

  • 在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。
  • 递归式方法可以被用于解决很多的计算机科学问题.
  1. 案例,求阶乘
#include <bits/stdc++.h>
#define MaxSize 10
using namespace std;

int fac(int n)
{
    // 1. 终止条件
    if (n == 1 || n == 0)
    {
        return 1;
    }
    else
    {
        //   n != n *fac(n - 1);
        // 2. 拆分成类型规模更小的类型问题
        int r = fac(n - 1);
        // 3. 汇聚成为规模更大的问题r=(n-1)!
        return n * r;
    }
}
// 求阶乘
int main()
{
    int a = 5;
    // cout << a << endl;
    int fa = fac(5);
    cout << fa << endl;
    return 0;
}
  1. 想要按照数字的每一位从右到左打印出来。如果是这样,你可以尝试以下代码:
cpp#include <bits/stdc++.h>
#define MaxSize 10
using namespace std;

void reserve(int n, int digit) {
    if (digit == 1) {
        cout << n;
    } else {
        int p = 1;
        for (int i = 1; i < digit; ++i) {
            p *= 10;
        }
        int h = n / p;
        reserve(n % p, digit - 1);
        cout << h;
    }
}

int main() {
    reserve(123, 3);
    return 0;
}

这段代码首先计算出当前位数的值

  • (例如,对于3位数123,p的值是100),然后计算出下一位的值(123%100得到3)
  • 然后再递归打印下一位。这样就实现了从右到左打印出一个数字的每一位。但是注意,这段代码只适用于正整数。

7. 数组

静态数组和动态数组 image.png