快到天梯赛的日子了,题库里一堆二叉树的题目,搞的我这个没有学过数据结构的非常难受,加上之前大一学的指针忘了干干净净,才来复习一下指针。
希望大家阅读博客前先去阅读这篇博客,否则一些地方可能会有一些疑问
C++中关于int *p 和 int* p的区别?
下面是代码部分,共有两个例子:
第一个例子是将一个int型数据进行加一操作。
第二个例子是将一个int型指针所指的地址进行加一操作。
#include <stdio.h>
void getUpper(int *p){
(*p)++;
}
// **pointer的意思是指针的指针的意思
//因为我们需要存p的地址,所以使用pointer来存p的地址了。
void getPointerUpper(int **pointer,int arr[]){
*pointer =&arr[1];
}
int main(){
// 需要注意的一个地方是“ int *p”的“*p”和一般的“*p”不是一个意思。
// 第一个是声明一个名为p的指针。第二个是对指针p取值,也就是取该指针指向地址的数值。
// 如果有疑问可以访问下面的链接:
// https://blog.csdn.net/yangyong0717/article/details/73649220
// Example 1
printf("下面是指针对单个指针所指的地址的数据的加一示例:\n\n");
// 将a的地址传给函数getUpper,然后函数将在该地址的数据加一。
int a = 5;
printf("before:\na = %d\n",a);
getUpper(&a);
printf("after:\na = %d\n\n",a);
// Example 2
printf("下面是对指针所指地址加一的示例:\n\n");
// 将arr[0]的地址传给指针p,然后我们将p的地址传给函数,然后函数将
// p内存的地址赋值为&arr[1]
// 这里我们需要搞懂的是地址和指针的概念
// 指针和数据都含有一个地址
// 如果我们需要将p的地址从arr[0],到arr[1],这样我们必须得再给p分配一个
// 指向p的指针pointer,这样我们才能将p的地址加一,得到arr[1]。
int arr[5] = {2, 1, 3, 5, 4};
int *p = &arr[0];
// 如果有些疑问可以看一下下面注释的输出。
// printf("&p = %d\n",&p);
// printf("p = %d\n",p);
// printf("arr[0] = %d\n",&arr[0]);
printf("before:\n*p = %d\n",*p);
getPointerUpper(&p,arr);
printf("after:\n*p = %d\n",*p);
// 得出结论:
// 一个函数如果需要不返回值就改变一个局部变量的值。
// 我们可以使用指针获取他的地址进行操作。
}
感谢各位的阅读,如若有写的不好的地方还望斧正!
最后大家如果还是有疑问,请去这个大佬的视频:
C语言指针视频教程