c语言指针概念解释_初步

不要阅读本文,格式不好看,最重要的是知乎上有多个优秀的答案,结合着看更容易理解。本人只是作学习笔记,自己复习时,也会跳到知乎上看原答案。

 
 
作者:Wayne
链接:https://www.zhihu.com/question/24466000/answer/659429892
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
不理解指针,是因为有人教错了你。
有人告诉你,指针是“指向”某某某的,那就是误导你,给你挖了个坑。初学者小心不要误读这“指向”二字。

第一,“指针”通常用于保存一个地址,这个地址的数据类型在定义指针变量时确定。
举个例子,做个比较:
int a; //定义一个变量a,用于保存一个int类型。
int * b; //定义一个指针变量b,用于保存一个地址,这个地址所保存的数据应该是int类型。

第二,是变量就应该可以赋值,指针变量也一样。但一般不会给指针直接赋值一个数值,而是将其他变量的地址赋值给指针,或者其他指针的值赋值给这个指针。
继续上面的例子:
b=&a; //把变量a的地址赋值给b。“&”操作是取变量的地址。
继续举例:
int * c; //我们又定义一个指针c
c=b; //将b的值赋值给c,上面已经知道b是指针,它的值是a的地址,那么现在c 的值和b一样,也是个a的地址。

第三,指针变量保存的值,也就是地址是可以变的。
举个数组初始化的例子:
int d[100];
int * e;
e=&d[0]; //e保存了数组d的第一个数据的地址
for (int i=0; i<100; i++){
  *e = 0; //把该地址中的数据赋值0
  e++; //地址累加一次,也就是数组中下一个数据的地址
}
指针和其他变量一样,可以运算(一般是加减),也可以重新赋值。
注:大概只有内存连续的情况,才可以对对地址加减吧。

第四,指针有啥用。
比方说,我们有个函数,如下:
int add(int x){
  return (x+1); //把输入的值加1并返回结果。
}
好了,应用的时候是这样的:
{
  int a=1;
  a=add(a); //add函数返回的是a+1
  //现在 a等于2
}
很简单吧,就是把a都累加一次。
用指针怎么写:
void add(int *y){ //给入的是一个int指针,是一个地址。
  *y = *y + 1; //* 是指引用 这个地址所保存的变量
  //这条语句的意思就是,把这个地址里的值加1,然后放回这个地址(硬件层次)。
}
把这个函数用起来:
{
  int a=1;
  add(&a); //把a的地址传到函数里
  //add函数,就是把a的值加1,再放回到变量a里。
  //现在a等于2
}
试想一下,如果我们要对一个数据结构里的数据进行处理,那是不是就该传入这个结构的地址,在函数中依靠指针来引用这个地址的数据结构,进行运算。

第五,若已有一个指针变量,可不可以用另外一个指针来保存这个变量的地址呢。
可以的。
一个变量保存另一个指针的地址,那它就是通常所说是“指针的指针”了。
通常,指针的指针多用做(或指的是)函数指针或数据结构中有指针的情况。初学者搞不清,就不要勉强了。

第六,空指针可怕吗?
我们知道,一个变量要赋值后才能用,指针也是一样。指针不赋值(不给定地址)就拿来用,是不是也要出错。这个就是空指针。一般把指针赋值为Null,就是表明这个指针是空的,不能用。所以程序中一定要经常判别指针不是Null才能用。

最后,初学C语言,最好把复合的语句拆开来看,比较容易理解。像 int *a=&b; 这种,拆成
int * a;//定义一个int类型的指针变量a
a=&b;
就好理解了。
 
上面所说的,是指针比较基础的东西,希望能帮助初学者学习理清思路。
 

 ===================

注,指针变量定义最好加上后缀让人一看名字就知道这是个指针变量,如:

复制代码
    char *cPtr; // pointer to a character
    int *iPtr; // pointer to an integer
    float *fPtr; // pointer to float
    double *dPtr; // pointer to a double
    
    char *c_name_ptr;
    int *i_age_ptr;
    float *f_score_ptr;
    double *d_num_ptr;
复制代码

c,i,f,d表示了指针类型,Ptr后缀表明是个指针变量。

注:示例后四行是自己看资料想的写法,最好看专业资料有选择的吸收;

 

posted on   荆棘人  阅读(238)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2018-10-17 一些关键字-关注
2018-10-17 对编码内容多次UrlDecode
2018-10-17 js中判断值不等于undefined

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示