by Leozheng @ SRMVision
#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 */
#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;
}
#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
*/
#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;
}
值 | 地址 | |
---|---|---|
普通变量(int a;) | a | &a |
指针变量(int *b;) | *b | b |
引用的定义:int &a = b;
其余与普通变量使用一致,且会改变原变量。
#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;
}
#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