从零开始学C++(2)---指针

本文详细解释了C++中的指针概念,包括指针定义、解引用、内存占用、const指针、指针与数组和结构体的交互,以及程序的内存模型,如栈、堆、全局区、常量区等。
摘要由CSDN通过智能技术生成

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 可以访问结构体变量 sname 成员,通过 p->age 可以访问 age 成员。注意,因为是指针,所以需要使用箭头操作符 -> 来访问成员。

5.程序的内存模型

程序的内存模型是描述程序在运行时如何使用内存的一种抽象表示。它定义了程序内存的组织方式,包括堆、栈、全局变量等。下面是常见的程序内存模型:

  1. 栈(Stack):栈是用来存储局部变量和函数调用信息的一块内存空间。栈是一种自动分配和释放的数据结构,它遵循先进后出的原则。栈的大小有限,通常较小,使用过程中会动态地进行分配和释放。

  2. 堆(Heap):堆是用来存储动态分配的内存,例如动态创建的对象和数组。堆的大小较大,需要手动进行分配和释放。在多线程环境下,堆是被多个线程共享的。

  3. 全局区(Global Area):全局区存储全局变量和静态变量。全局变量在程序整个运行期间都存在,而静态变量的生命周期基于其作用域。

  4. 常量区(Constant Area):常量区存储常量数据,例如字符串常量和数字常量。它们在程序运行期间不可修改。

  5. 代码区(Code Area):代码区存储程序的指令和函数代码。它是只读的,不可修改。

在程序运行时,操作系统会为程序分配一块内存空间,用于存储这些区域。不同的编程语言和操作系统可能对内存模型有所差异,但以上的内存模型是通用的概念。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值