菏泽网站建设制作,阅读分享网站模板,移动端网站建设的意义,wordpress 微信登陆文章目录 一、指针1、定义2、解引用3、指针的运算4、指针与数组4.1、通过指针操作数据4.2、指针与数组名的区别4.3、数组名作为函数形参 5、指针作为函数参数5.1、作为函数参数5.2、常指针与指针常量 6、指针与动态内存分配7、注意事项8、总结 前言#xff1a; 在C编程中… 文章目录 一、指针1、定义2、解引用3、指针的运算4、指针与数组4.1、通过指针操作数据4.2、指针与数组名的区别4.3、数组名作为函数形参 5、指针作为函数参数5.1、作为函数参数5.2、常指针与指针常量 6、指针与动态内存分配7、注意事项8、总结 前言 在C编程中指针是一种非常重要的概念。它们允许程序直接访问内存地址从而提供对数据的高效操作和灵活控制。本文将详细介绍C中的指针定义、使用、操作以及一些注意事项。 一、指针
1、定义 指针是一个变量其存储的是另一个变量的内存地址而不是数据值本身。在 C 中每个变量都有一个内存地址而指针就是用来存储这些地址的变量。指针的声明通常通过在变量类型前加上星号*来完成。 int a 10; // 定义一个整型变量 a并赋值为 10
int *ptr a; // 定义一个整型指针 ptr并将 a 的地址赋给 ptr2、解引用 解引用是指通过指针访问它所指向的变量的值。解引用使用星号*运算符。例如 int value *ptr; // 通过指针 ptr 解引用获取它所指向的变量 a 的值并赋值给 value3、指针的运算 指针可以进行一些基本的算术运算如加减整数以及比较运算。这些运算都是基于指针所指向的内存地址进行的。例如 int arr[5] {1, 2, 3, 4, 5};
int* p arr[0]; // p 指向数组的第一个元素 // 指针加法
int* q p 2; // q 指向数组的第三个元素索引为 2 的元素 // 指针减法
int diff q - p; // diff 的值为 2因为 q 和 p 之间相隔两个元素4、指针与数组
4.1、通过指针操作数据 在 C 中数组名可以被视为指向数组第一个元素的指针。因此数组和指针在很多情况下可以互换使用。例如 int arr[5] {1, 2, 3, 4, 5};
int* p arr; // 数组名 arr 实际上是指向数组第一个元素的指针因此可以直接赋值给指针 p通过指针遍历数组 for (int i 0; i 5; i) { std::cout *(p i) std::endl; // 通过指针 p 遍历数组
}4.2、指针与数组名的区别 指针与数组名区别如下 指针数组名概念是一个变量存储的数据是地址代表的是该数组最开始的一个元素的地址sizeof指针变量的大小计算数组占用的内存大小通过sizeof(数组名)/sizeof(数组名[0])计算数组长度常性可以通过指针修改指向的变量也可以修改保存的地址数组名是一个常量不允许修改
4.3、数组名作为函数形参 数组名作为函数形参时沦为一个普通的指针如下 #include iostreamusing namespace std;void display(int num[], int len)
{cout size sizeof(num) endl;;for (int index 0; index len; index ) {cout num[index];}
}int main()
{int num[5] {1, 2, 3, 4, 5};display(num, 5);return 0;
}输出结果 size 4
12345
Process returned 0 (0x0) execution time : 0.016 s
Press any key to continue.从输出结果可以看出来sizeof()的结果是4说明此时的数组名是一个普通指针。 5、指针作为函数参数
5.1、作为函数参数 通过传递指针可以避免值传递带来的性能开销并且可以直接修改原始数据。 void modifyValue(int* p) {*p 20; // 修改p指向的值
}
int main() {int x 10;modifyValue(x); // 传递x的地址std::cout x; // 输出20return 0;
}5.2、常指针与指针常量 指针*与常量const谁在前先读谁例如 int main(){int a 10;int b 20;int const *p1 a; // const在前定义为常指针int * const p2 b; // *在前定义为指针常量return 0;
}常指针 指针指向的是常量不能通过指针改变指向的变量的值但是指针保存的地址可以改变。指针常量 指针是常量不能改变指针保存的地址但是可以改变指针指向的变量。
6、指针与动态内存分配 C 提供了 new 和 delete 运算符来进行动态内存分配和释放。与静态数组或变量不同动态分配的内存可以在程序运行时根据需要分配和释放。例如 int* ptr new int; // 动态分配一个整型变量的内存
*ptr 10; // 通过指针访问并赋值
std::cout *ptr std::endl; // 输出值
delete ptr; // 释放动态分配的内存对于动态分配的数组需要使用 delete[] 运算符来释放内存 int* arr new int[5]; // 动态分配一个包含 5 个整型元素的数组
for (int i 0; i 5; i) { arr[i] i 1;
}
for (int i 0; i 5; i) { std::cout arr[i] ;
}
std::cout std::endl;
delete[] arr; // 释放动态分配的数组内存7、注意事项
空指针 未初始化的指针可能指向任意内存地址使用前应该将其初始化为 nullptrC11 引入的或 NULL传统方式但不建议在现代 C 中使用。野指针 指针指向的内存已被释放但指针本身仍然保留原来的地址。使用野指针会导致未定义行为。为了避免野指针可以在释放内存后将指针设置为 nullptr。指针类型转换 不同类型的指针之间不能直接转换除非进行显式类型转换如使用 reinterpret_cast。不当的指针类型转换可能导致不可预见的行为。
8、总结 指针是 C 编程中的一把双刃剑它提供了对内存的直接操作能力使得程序能够更高效地进行数据管理和访问。然而不恰当的指针使用也可能导致严重的内存管理问题如内存泄漏、野指针等。因此在使用指针时务必小心谨慎遵循最佳实践确保程序的稳定性和安全性。