指针是什么?指针怎么用?指针数组又是什么???
想必大家刚学C语言的时候对指针可谓是十分头疼了,听也听不懂,用也不会用
下面我来用我的理解来教你指针怎么用,还你一个脑子
1.指针的声明
声明指针时,需要指定它所指向的数据类型,并在变量名前加上*。
例如:
int *p; // p 是一个指向 int 类型变量的指针
2.取地址运算符 &
& 用于获取变量的内存地址。
例如:
int a = 10;
int *p = &a; // p 存储了变量 a 的地址
注:上面可以看到(a=10),这里是把a的地址传给p指针
细心的同学可能发现:诶?scanf函数不也是&这个符合吗?确实,其实scanf函数获得输入的地址来实现的
对于指针的声明其实还有个写法:
3.指针的另一种声明
例如:
int* p;
这个写法和上面的一样,但是可以更直观的看到,p就是指针!后续所有的p都是指针,*p是解引用,是p指针里面存储的内容
4. 解引用运算符 *
* 用于访问指针所指向地址的值。
例如:
int a = 10;
int *p = &a;
int b = *p; // b 现在等于 10,因为 *p 访问了 p 所指向的 a 的值
第4个,所以这就是*p的作用。
5. 指针的初始化
指针在使用前应初始化,未初始化的指针可能指向无效地址,导致程序崩溃。
例如:
int *p = NULL; // 初始化为 NULL,表示不指向任何地址
6. 指针的运算
指针可以进行加减运算,移动指向的内存地址。
例如:
int arr[3] = {10, 20, 30};
int *p = arr; // p 指向数组的第一个元素
p++; // p 现在指向数组的第二个元素
第5个的初始化,不仅仅是一个习惯,是必要,定义指针是一定要初始化的,不然有可能会发生不好的事情
对于第6个,指针只可以进行加减,加运算就是当前指针地址加一,减法同理,一定注意指针是不能乘除的!
7. 指针与数组
数组名本身就是一个指针,指向数组的第一个元素。
例如:
int arr[3] = {10, 20, 30};
int *p = arr; // p 指向数组的第一个元素
8. 指针与函数
指针可以作为函数参数,传递变量的地址,以便在函数中修改原变量。
例如:
void increment(int *p) {
(*p)++; // 修改 p 所指向的变量的值
}
int main() {
int a = 10;
increment(&a); // 传递 a 的地址
printf("%d\n", a); // 输出 11
return 0;
}
9. 指针的指针
指针也可以指向另一个指针。
例如:
int a = 10;
int *p = &a;
int **pp = &p; // pp 是一个指向指针 p 的指针
10. 动态内存分配
使用 malloc 和 free 进行动态内存分配和释放。
例如:
int *p = (int *)malloc(sizeof(int)); // 分配一个 int 大小的内存
*p = 10;
free(p); // 释放内存
第7个,指针和指针数组几乎没有太大的差别,你就把指针看成一个空间块,里面可以存储一个数或者一堆数就行了
第8个注意,传递地址时,不要忘了&符号
第9个指针的指针也就是双重指针,就是定义一个大的白盒子把第一次定义的小黑盒子裹住一样,俄罗斯套娃,这个的应用就是在你使用指针时,想把这个指针一整个的运用才使用双重指针:
(C语言)给出一个区间,写出区间内所有的质数(指针数组解答)(双指针用法)-CSDN博客
在这条博客里,我使用了双指针,感兴趣的同学可以去看看
关于第10条动态分配,使用非常广泛,有数组的地方就有这个,搭配头文件stdlib.h使用分配malloc函数,或者使用重新分函数realloc函数,最后记得释放即可
(C语言)字符串反转函数(指针,递归解法)-CSDN博客
这篇博客,使用了malloc和realloc,其实,realloc更多的是防止垃圾值
说了这么多,有小伙伴可能还有点疑惑,那指针到底怎么用???
你只需要知道一点,使用指针的目的就是让局部变量成为全局变量,比如在main函数中a=10;我想在fun函数中也让a=10,怎么办?用指针,怎么用?先声明,然后传递地址就行,如:
#include <stdio.h>
//定义计算所需要的函数
void fun(int *size1,int *size2,int *size3){
//确保输入的区间正确(例:用户输入9 3,给他改成3 9)
//否则for不能运行
if(*size1 >*size2){
int *t=size1;
size1=size2;
size2=t;
}
//计算区间内每个数是否为c的倍数
for(int i=*size1;i<*size2+1;i++){
if (i%*size3==0){
printf("%d是%d的倍数\n",i,*size3);
}
}
}
int main(){
int a=0,b=0,c=0;
printf("请输入一个区间:\n");
//检验scanf是否合法;输入两个整数所以用2来判断
if (scanf("%d %d",&a,&b)!=2){
printf("输入的不是有效数字!");
return 1;
}
printf("请输入倍数:\n");
检验scanf是否合法;输入一个整数所以用1来判断
if (scanf("%d",&c)!=1){
printf("输入的不是有效数字!");
return 1;
}
fun(&a,&b,&c);
return 0;
}
对于博客:
(C语言)定义一个区间输出该区间内为某个数的倍数的数(指针解法)-CSDN博客
本期博客就到这里,总结,指针就是让局部变量变成全局变量的方法
下面这篇博客,就用了局部变量变成全局变量才实现代码的!!
(C语言小项目)猜字游戏(正式版)_字谜游戏goc程序-CSDN博客
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!