1.指针
(1)定义指针:数据类型 * 变量名
(2)指针变量=&指向的变量
(3)*为解引用,*指针变量为指针指向内存中的值
(4)指针所占内存空间为8个字节(64位系统下)32位系统为4个字节
#include<iostream>
using namespace std;
int main() {
int a = 0;
int* p;//定义指针变量
p = &a;//指针指向a,记录a的地址
cout << p << endl;//a的地址:000000558AFCF904
cout << &a << endl;//与上一行输出结果一致
cout << *p << endl;//*为解引用,*p为指针指向内存中的值
cout << sizeof(p) << endl;
cout << sizeof(float*) << endl;
cout << sizeof(double*) << endl;
cout << sizeof(char*) << endl;//指针所占内存空间为8个字节(64位)
}
2.const和指针
(1)const 类型 * 指针为常量指针
(2)常量指针指向的内容不能通过指针修改,但可以修改指针的指向
int b = 10;
const int* p1 = &b;
//*p1 = 20;常量指针指向的内容不能通过指针修改
p1 = &a;//但可以修改指针的指向
(3)类型 * const 指针为指针常量
(4)指针常量指向的内容可以通过指针修改,但不可以修改指针的指向
int c = 20;
int* const p2 = &c;
*p2 = 30;
//p2 = &a;
注:const同时修饰时均不可以修改
3.指针和数组
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//数组名为数组首地址
cout << *p << endl;//输出1
cout << *(p+1) << endl;//输出2,*优先级高于++,低于+
数组指针和指针数组是指C++中的两种不同的数据类型。
(1)数组指针是指向数组的指针,它指向数组的首地址。可以通过数组指针来访问数组中的元素。例如, int *p; int arr[5]; p = arr; 这里的p是一个指向整型数组的指针,它指向arr数组的首地址。
(2)指针数组是一个数组,其中的元素都是指针。每个指针可以指向不同的数据类型。例如,int *arr[5]; 这里的arr是一个指针数组,它包含了5个指向整型数据的指针。可以通过数组索引来访问指针数组中的元素,例如,arr[0]表示第一个指针元素。
总结:数组指针指向数组,指针数组是一个数组,其中的元素都是指针。
4.指针和结构体
指针可以用来指向结构体,这样可以方便对结构体进行操作。以下是一个示例:
#include <iostream>
// 定义一个结构体
struct student {
char name[20];
int age;
};
int main() {
// 定义一个结构体变量
struct student s;
// 定义一个指向结构体的指针
struct student *p;
// 将指针指向结构体变量
p = &s;
// 通过指针访问结构体成员
printf("请输入姓名:");
scanf("%s", p->name);
printf("请输入年龄:");
scanf("%d", &(p->age));
// 输出结构体成员
printf("姓名:%s\n", p->name);
printf("年龄:%d\n", p->age);
return 0;
}
在上述示例中,先定义了一个结构体 student
,包含了姓名和年龄两个成员。然后在 main
函数中,先定义了一个结构体变量 s
,再定义了一个指向结构体的指针 p
,并将指针指向结构体变量:
p = &s;
接下来可以通过指针来访问结构体的成员。例如,通过 p->name
可以访问结构体变量 s
的 name
成员,通过 p->age
可以访问 age
成员。注意,因为是指针,所以需要使用箭头操作符 ->
来访问成员。
5.程序的内存模型
程序的内存模型是描述程序在运行时如何使用内存的一种抽象表示。它定义了程序内存的组织方式,包括堆、栈、全局变量等。下面是常见的程序内存模型:
-
栈(Stack):栈是用来存储局部变量和函数调用信息的一块内存空间。栈是一种自动分配和释放的数据结构,它遵循先进后出的原则。栈的大小有限,通常较小,使用过程中会动态地进行分配和释放。
-
堆(Heap):堆是用来存储动态分配的内存,例如动态创建的对象和数组。堆的大小较大,需要手动进行分配和释放。在多线程环境下,堆是被多个线程共享的。
-
全局区(Global Area):全局区存储全局变量和静态变量。全局变量在程序整个运行期间都存在,而静态变量的生命周期基于其作用域。
-
常量区(Constant Area):常量区存储常量数据,例如字符串常量和数字常量。它们在程序运行期间不可修改。
-
代码区(Code Area):代码区存储程序的指令和函数代码。它是只读的,不可修改。
在程序运行时,操作系统会为程序分配一块内存空间,用于存储这些区域。不同的编程语言和操作系统可能对内存模型有所差异,但以上的内存模型是通用的概念。