SRM Vision 暑期培训

by Leozheng @ SRMVision

§3  结构体、指针与引用 / 函数参数

#include <iostream>
using namespace std;
int main () {
    int var[3] = {10, 100, 200}; // 实际变量的声明
    int *ip; // 指针变量的声明
    ip = &var[0]; // 在指针变量中存储 var[0] 的地址
    ip = var + 0; // 对于数组, 还可以这样写, 等价于&var[0]
    // 输出在指针变量中存储的地址
    cout << "Address of ip: " << ip << endl;
    // 访问指针中地址的值
    cout << "Value of *ip: " << *ip << endl; // 解指针
    ip++; // 向后移动指针的位置
    cout << "Address of ip: " << ip << endl; 
    cout << "Value of *ip: " << *ip << endl;
    *ip++; // 优先级上 ++ 大于 *,故先将指针移到数组第三个元素地址上再解指针将数值增加 1
    cout << "Address of ip: " << ip << endl; 
    cout << "Value of *ip: " << *ip << endl;
    --*ip; // 先解指针再将数值减去 1
    cout << "Address of ip: " << ip << endl; 
    cout << "Value of *ip: " << *ip << endl;
    cout << "Value of var[2]: " << var[2] << endl; // 指针会修改原始数据
    return 0;
}

/*Address of ip: 000000000014FCD8 
  Value of *ip: 10 
  Address of ip: 000000000014FCDC 
  Value of *ip: 100 
  Address of ip: 000000000014FCE0 
  Value of *ip: 200 
  Address of ip: 000000000014FCE0 
  Value of *ip: 199 
  Value of var[2]: 199 */

2.6 结构体、指针

#include <iostream>
using namespace std;

struct Node{ 		// 此时 Node 可以省去,变成无名结构
    int _data; 		// 数据域
    Node *_next; 	// 指针域
}list_head; 		// 定义了一个 Node 类型的变量

Node tree_node[10]; 	// 定义了一个 Node 类型的数组

int main(){
    // 结构变量.成员名
    list_head._data = 1;
    list_head._next = nullptr; // 'nullptr' instead of 'NULL'.

    return 0;
}
#include <iostream>
using namespace std;

struct Node{
    int _data;
    Node *_next;
}*list_head; 			// 定义了一个 Node 类型的指针

int main () {
    
    list_head->_data = 1;	// 结构体指针->成员名
    list_head->_next = nullptr;
    
    return 0;
}

2.6 结构体、指针与引用

#include <iostream>
using namespace std;

int main () {
    // 动态内存分配
    int *a = new int(0); 	// 动态创建整数并赋初值
    int *b = new int[4]{ 0 }; 	// 动态创建数组并赋初值, 数组长度可变
    delete a; 			// 回收单个内存空间
    delete[] b;			// 回收数组
    
    // 指针与常量、数组
    int a = 10, b = 20;
    int *const p = &a;
    *p = 30; 		// p 指向的地址是一定的,但其内容可以修改
    int const* q = &a;
    q = &b; 		// 指针可以指向其他地址,但是内容不可以改变
    
    // 指针与数组
    int var[MAX] = {10, 100, 200};
    int *ptr;
    ptr = var; // 数组名实际上就是数组首个元素的地址
    cout << "var[" << 1 << "]的内存地址为 " << &ptr[1] << endl;
    cout << "var[" << 1 << "] 的值为 " << ptr[1] << endl;
    ptr++;
    cout << &ptr[1] << endl;
    cout << ptr[1] << endl;
    return 0;
}
/*  var[1]的内存地址为 000000000014FCDC 
    var[1] 的值为 100 
    000000000014FCE0 
    200 
*/

2.6.4 动态内存分配 / 指针与数组

#include <iostream>
using namespace std;
int main () {
    int i; double d;
    // 定义引用变量
    int& r = i;
    double& s = d;
    i = 5;
    cout << "Value of i : " << i << endl; 
    cout << "Value of i reference : " << r << endl;
    d = 11.7;
    cout << "Value of d : " << d << endl; 
    cout << "Value of d reference : " << s << endl;
    return 0;
}

2.6.5 引用

2.6 本小节小结

地址
普通变量(int a;) a &a
指针变量(int *b;) *b b

引用的定义:int &a = b;

其余与普通变量使用一致,且会改变原变量。

2.7.2 函数参数

#include <iostream>
using namespace std;

void swap1(int x, int y){
    int temp;
    temp = x;
    x = y;
    y = temp;
}
void swap2(int *x, int *y){
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
void swap3(int &x, int &y){
    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main() {
    int a, b;
    swap1(a, b);  	// a,b 没有交换。
    swap2(&a, &b); 	// 需要写 &
    swap3(a, b); 	// 不用写 &
    
    return 0;
}

2.7.2 函数参数

#include <iostream>
using namespace std;
double vals[] = {10.1, 12.6, 33.1};
double& setValues(int i) {
    double& ref = vals[i];
    return ref; // 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i]
}
int main () {
    cout << "改变前的值" << endl;
    for (int i = 0; i < 3; i++) {
        cout << "vals[" << i << "] = ";
        cout << vals[i] << endl;
    }
    setValues(1) = 20.23; // 改变第 2 个元素
    setValues(2) = 70.8; // 改变第 3 个元素
    cout << "改变后的值" << endl;
    for (int i = 0; i < 3; i++) {
        cout << "vals[" << i << "] = ";
        cout << vals[i] << endl;
    }
    return 0;
}

第三讲 - 作业:(必做)

请设计一个时钟程序,要求:

1. 使用结构体指针存储时、分、秒三个数据。

2. 程序需要有:显示当前时间、修改时间的功能,其他请自由发挥。

3. 设计一个函数,用引用或指针的函数参数实现修改时间的功能。

感 谢

@ SRMVision