C语言指针入门介绍
文章目录1. 指针概念1.1 * 符号的含义1.2 关于指针的重要说明1. 指针具有两个值2. 指针必须初始化3. 指针类型决定指针运算2. 一级指针3. 指针与数组4. 指针赋值1. 指针概念1.1*符号的含义在 C/C 中*符号有三种含义1.乘法1*222.声明*p 将 p 声明为指针变量3.解引用获取指针所指向的数据1.2 关于指针的重要说明1. 指针具有两个值例如int *p a;1. 指针本身的值它所保存的地址2. 它所指向的对象的值2. 指针必须初始化未初始化的指针会成为野指针可能导致程序错误。3. 指针类型决定指针运算指针的类型决定了指针运算的步长。不同类型的指针执行1操作时它们实际跳过的字节数不同。这是 C/C 指针的核心特性之一。例如对int*指针执行自增操作时它会向前移动sizeof(int)个字节通常为 4 字节而对char*指针执行自增操作时它只移动 1 个字节。因此不同类型的指针自增后指向的位置不同这在遍历数组时尤为重要。2. 一级指针一级指针是指向普通变量的指针它保存该变量的内存地址。通过解引用运算符*你可以访问或修改存储在该地址中的数据。inta5;int*pa;//int*pnullptr;pa;*p5;在上面的代码中p是一个一级指针它指向变量a的地址。通过*p你可以读取或修改a的值。请注意指针在使用前必须初始化否则它会成为野指针可能导致程序崩溃或产生不可预料的错误。3. 指针与数组数组退化为指针在 C/C 中在大多数表达式中数组名会被隐式转换为指向其首元素的指针。这被称为数组退化。例如对于int ar[5]当ar被传递给函数或赋值给指针时ar会退化为一个指向数组首元素的int*指针。例如constintm5;intar[m]{1,2,3,4,5};int*par;for(inti0;im;i){printf(%d %d %d %d ,ar[i];*(ari),p[i],i[p],*pi);// 这些表达式都是等价的}在上面的循环中ar[i]、*(ar i)、p[i]、i[p]和*(p i)这五个表达式在语义上是等价的它们都表示数组ar第i个元素的值。这是因为数组下标本质上是指针运算的语法糖。4. 指针赋值不同的基本数据类型之间可以相互赋值但不同的指针类型之间不能相互赋值需要强制类型转换。基本数据类型如int、double和char之间可以隐式或显式地相互赋值编译器会自动进行类型转换。但是不同类型的指针不能直接相互赋值因为它们所指向的数据类型和步长不同。直接赋值会导致类型不匹配的编译错误。如果确实需要转换必须使用强制类型转换如reinterpret_cast或 C 风格的(int*)但这样做需要开发者自己确保转换是安全的。