C++课堂笔记六

C++课堂笔记六

指针

每个变量都被存放在某个内存地址(以字节为单位)开始的若干个字节中。

“指针”,也称作“指针变量”, 大小为4个字节(或8个字节)的变量,其内容代表一个内存地址。

通过指针,能够对该指针的内存区域进行读写。

  1. 指针的定义:

类型名 *指针变量名

int p = (int ) 40000;

*p 代表地址40000开始处的若干个字节的内容。

通过指针访问其指向的内存空间

1
2
3
4
5
int *p = (int *) 40000; 
*p = 5000;//往地址40000处起始的若干个字节的内存空间里写入5000
int n = *p; //将地址40000处起始的若干字节的内容赋值给n

(“若干” = sizeof(int), 因为 int *p)

  1. 指针的用法:
1
2
char ch1 = 'A';
char *pc = &ch1; //使得pc指向变量ch1

  1. 指针的作用:
1
2
3
4
5
6
(底层)
有了指针,就有了自由访问内存空间的手段

不需要通过变量,就能对内存直接进行操作。 通过指针,程序能访问的内存区域就不仅限于变量所占据的数据区域。

在C++中,用指针p指向a的地址,然后对p进行加减操作,p就能指向a后面或前面的内存区域,通过过p也就能访问这些内存区域。

指针的互相赋值:不同类型的指针,如果不经过强制类型转换,不能直接互相赋值。

1
2
3
pn = (int * ) &c;
int n = *pn; //n值未定
*pn = 0x12345678;
  1. 指针的运算


结构

用“struct” 关键字来定义一个“结构”, 也就定义了一个新的数据类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct  结构名
{
类型名 成员变量名;
类型名 成员变量名;
类型名 成员变量名;
......
};

例:
struct Student {
unsigned ID;
char szName[20];
float fGPA;
};

一个结构的成员变量可以是任何类型的,包括可以是另一个结构类型:

1
2
3
4
5
6
7
8
9
10
11
struct Date{
int year;
int month;
int day;
};
struct StudentEx{
unsigned ID;
char szName[20];
float fGPA;
Date birthday;
};

结构的成员变量可以是指向本结构类型的变量的指针:

1
2
3
4
5
6
struct Employee{
string name;
int age;
int salary;
Employee * next;
}

访问结构变量的成员变量

一个结构变量的成员变量,可以完全和一个普通变量一样来使用,也可以取得其地址。

结构变量名.成员变量名

1
2
3
4
5
6
7
StudentEx stu;
cin>>stu.fGPA;
stu.ID = 12345;
strcpy(stu.szName, "Tom");
cout<<stu.fGPA;
stu.birthday.year = 1984;
unsigned int * p = &stu.ID //p指向stu中的ID成员变量

结构变量的初始化

StudentEx stu = { 1234, "Tom", 3.78, {1984,12,28} };

定义指向结构变量的指针

结构名 * 指针变量名;

1
2
3
4
StudentEx * pStudent;
StudentEx Stu1;
pStudent = & Stu1;
StudentEx Stu2 = *pStudent;

通过指针, 访问其指向的结构变量的成员变量:

1
2
3
4
5
6
7
8
9
10
11
指针 -> 成员变量名

(* 指针). 成员变量名

StudentEx Stu;
StudentEx * pStu;
pStu = & Stu;
pStu -> ID = 12345;
(*pStu).fGPA = 3.48;
cout<< Stu.ID<<endl;
cout<<Stu.fGPA<<endl;