C++中的指针

简介: C++中的指针

指针允许直接操作内存地址,从而实现对数据的灵活控制。

指针的概念

指针是一个变量,其存储的是另一个变量的内存地址。在C++中,每个变量在内存中都有一个唯一的地址,指针变量可以存储这个地址。声明指针时,需要指定指针所指向的数据类型,例如,int* p;声明了一个指向整型数据的指针变量p

指针运算

  1. 解引用(Dereferencing):使用*操作符获取指针所指向的变量的值。例如,如果p指向一个整数,那么*p就是该整数的值。
  2. 指针加减(Pointer Arithmetic):可以对指针进行加减运算,通常用于遍历数组。例如,p++使指针向后移动到下一个元素(假设是数组的话)。
  3. 比较:指针之间可以进行关系运算,如 <, >, <=, >=, ==, !=,用于比较它们所指向的地址。

指针与数组

在C++中,数组名实际上就是一个指向数组首元素的常量指针。这意味着你可以用指针对数组进行操作,比如遍历数组:

int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // ptr现在指向数组arr的首元素
for(int i = 0; i < 5; ++i) {
    std::cout << *(ptr + i) << std::endl; // 通过指针访问数组元素
}

堆内存分配

C++提供了两种内存分配方式:栈(stack)和堆(heap)。栈内存由编译器自动管理,而堆内存需要手动管理。

  • 栈内存分配:局部变量通常存储在栈上,生命周期与定义它的函数或代码块相同。
  • 堆内存分配:使用new操作符在堆上动态分配内存。当不再需要时,应使用delete释放内存。

例如,动态分配一个整型数组:

int* heapArr = new int[5]; // 在堆上分配一个大小为5的整型数组
heapArr[0] = 1;
// ... 对其他元素赋值
delete[] heapArr; // 使用完毕后释放内存

const指针

const指针用来表示指针所指向的数据是不可更改的。有两种主要的用法:

  1. 指向const的指针:指针指向的值不能被改变,但指针本身可以指向另一个值。声明形式如const int* ptr,意味着ptr指向的整数是常量。
const int num = 5;
const int* pConst = &num; // pConst指向一个常量整数
// *pConst = 10; // 错误:不能通过pConst修改num的值
  1. const指针:指针一旦初始化后,就不能再指向其他地址,但指向的数据可以修改。声明形式如int* const ptr
int num = 5;
int* const pConstAddr = &num; 
*pConstAddr = 10; // 正确:可以通过指针修改num的值
// pConstAddr = &anotherNum; // 错误:不能改变pConstAddr的地址

指针与函数

  1. 函数指针:指向函数的指针,可以用来存储函数的地址,进而通过指针调用函数。
void greet() { std::cout << "Hello!" << std::endl; }
void (*funcPtr)() = &greet; // 定义一个函数指针并初始化
funcPtr(); // 通过函数指针调用greet函数
  1. 指针函数:返回值为指针的函数。
int* returnIntPtr() {
    static int value = 10;
    return &value;
}
int main() {
    int* ptr = returnIntPtr();
    std::cout << *ptr << std::endl; // 输出10
}

字符指针

字符指针通常用来指向字符串或者单个字符,可以用来操作字符串。

char str[] = "Hello";
char* cPtr = str; // cPtr指向字符串"Hello"
std::cout << cPtr << std::endl; // 输出"Hello"

指针数组

指针数组是一组指向特定类型数据的指针。

int num1 = 1, num2 = 2, num3 = 3;
int* ptrArray[3] = {&num1, &num2, &num3}; // 指针数组,每个元素指向一个整数
std::cout << *ptrArray[0] << std::endl; // 输出1

命令行参数

在C++中,main函数可以接受两个参数,第一个是命令行参数的数量,第二个是一个指向这些参数的指针数组(字符指针数组),这些参数以NULL结束。

#include <iostream>
int main(int argc, char* argv[]) {
    for(int i = 0; i < argc; ++i) {
        std::cout << "Argument " << i << ": " << argv[i] << std::endl;
    }
    return 0;
}

函数指针数组

可以创建一个数组,其中每个元素都是指向函数的指针,这样就可以通过索引来调用不同的函数。

void func1() { std::cout << "Function 1 called" << std::endl; }
void func2() { std::cout << "Function 2 called" << std::endl; }
typedef void (*FuncPtr)(); // 函数指针类型别名
FuncPtr funcPtrArray[] = {func1, func2};
int main() {
    funcPtrArray[0](); // 调用func1
    funcPtrArray[1](); // 调用func2
}

C++中指针的灵活性和强大功能,但也强调了正确使用它们的重要性,以避免常见的编程错误。

目录
相关文章
|
8天前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
17 1
|
1天前
|
存储 算法 安全
C++一分钟之-数组与指针基础
【6月更文挑战第19天】在C++中,数组和指针是核心概念,数组是连续内存存储相同类型的数据,而指针是存储内存地址的变量。数组名等同于指向其首元素的常量指针。常见问题包括数组越界、尝试改变固定大小数组、不正确的指针算术以及忘记释放动态内存。使用动态分配和智能指针可避免这些问题。示例代码展示了安全访问和管理内存的方法,强调了实践的重要性。
17 3
|
5天前
|
编译器 Linux C++
C++智能指针
**C++智能指针是RAII技术的体现,用于自动管理动态内存,防止内存泄漏。主要有三种类型:已废弃的std::auto_ptr、不可复制的std::unique_ptr和可共享的std::shared_ptr。std::unique_ptr通过禁止拷贝和赋值确保唯一所有权,而std::shared_ptr使用引用计数来协调多个指针对同一资源的共享。在C++17中,std::auto_ptr因设计缺陷被移除。**
|
8天前
|
数据采集 存储 编译器
this指针如何使C++成员指针可调用
本文介绍了C++中的this指针,它是一个隐藏的指针,用于在成员函数中访问对象实例的成员。文章通过代码示例阐述了this指针的工作原理,以及如何使用指向成员变量和成员函数的指针。此外,还提供了一个多线程爬虫示例,展示this指针如何使成员指针在对象实例上调用,同时利用代理IP和多线程提升爬取效率。
this指针如何使C++成员指针可调用
|
14天前
|
C++
【C++系列】指针对象和对象指针的区别
这段内容介绍了C++中`ListNode`对象和指针的两种使用方式以及它们的区别。首先,`ListNode dummy(0); ListNode* cur = &dummy;创建了一个`ListNode`对象`dummy`在栈上,`cur`是`dummy`的地址。而`ListNode* dummy = new ListNode(0); ListNode* cur = dummy;`则在堆上分配了一个`ListNode`,`dummy`和`cur`都是指向该对象的指针。使用`&dummy`作为虚拟头节点简化链表操作,避免特殊处理。栈分配内存自动管理但生命周期受限,堆分配内存需手动释放且速度较慢。
|
15天前
|
存储 安全 编译器
C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
6 0
|
15天前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
11 2
|
18天前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
20天前
|
存储 设计模式 安全
C++中的函数指针技术详解
C++中的函数指针技术详解
14 0
|
20天前
|
C++
在C和C++中,指针的算术操作
在C和C++中,指针的算术操作

热门文章

最新文章