C语言中指针是什么?
学习交流可加
微信读者交流①群 (添加微信:coderAllen)
程序员技术QQ交流①群:736386324
恶名昭著的指针究竟是什么
“ 指针是一种保存变量地址的变量,在 C 中频繁地使用。”
“指针类型”其实不是单独存在的,它是由其他类型派生而成的
因为“指针类型”是类型,所以它和 int 类型、double 类型一样,也存在“指针类型变量”和“指针类型的值”。糟糕的是,“指针类型”、“指针类型变量”和“指针类型的值”经常被简单地统称为“指针”,所以非常容易造成歧义,这一点需要提高警惕*
注意:
先有“指针类型”。
因为有了 “指针类型”,所以有了“指针类型的变量 ”和 “指针类型的值”。
指针类型同样如此,既存在指针类型的变量,也存在指针类型的值
因此,几乎所有的处理程序中,所谓的“指针类型的值”,实际是指内存的地址
举个例子:
#include <stdio.h>
int main(void)
{
int hoge = 5;
int piyo = 10;
int *hoge_p;
/*输出每个变量的地址*/
printf("&hoge..%p\n", &hoge);
printf("&piyo..%p\n", &piyo);
printf("&hoge_p..%p\n", &hoge_p);
/*将hoge 的地址赋予hoge_p*/
hoge_p = &hoge;
printf("hoge_p..%p\n", hoge_p);
/*通过hoge_p 输出hoge 的内容*/
printf("*hoge_p..%d\n", hoge_p);
/*通过hoge_p 修改hoge 的内容*/
*hoge_p = 10;
printf("hoge..%d\n", hoge);
return 0;
}
在我的环境下输出:
//Red Hat 4.4.7-17 gcc version 4.4.7
&hoge..0x7ffefe4950ac
&piyo..0x7ffefe4950a8
&hoge_p..0x7ffefe4950a0
hoge_p..0x7ffefe4950ac
*hoge_p..-28749652
hoge..10
因为存在“指针类型”,所以存在“指针类型的变量”和“指针类型的值”。这里输出的“地址”,是指“指针类型的值”
指针变量 hoge_p 保存了另外一个变量 hoge 的地址,我们认为“hoge_p 指向hoge“
变量不一定按照声明的顺序保存在内存中
在指针前面加上*,可以表示指针指向的变量
因为hoge_p 和 hoge 表示同一个事物,通过hoge_p 输出 hoge 的值之外,还可以赋值。在第 22 行,通将 10 赋给*hoge_p,修改了 hoge 的值。在第 23 行输出 hoge 的值,运行结果为 10。
总结:
对变量使用&运算符,可以取得该变量的地址。这个地址称为指向该变量的指针。
指针变量 hoge_p 保存了指向其他变量的地址的情况下,可以说“hoge_p 指向 hoge”。
对指针变量运用运算符,就等同于它指向的变量。如果 hoge_p 指向 hoge,hoge_p 就等同于 hoge
int *hoge_p;
似乎这里声明了一个名为*hoge_p 的变量,而实际上,这里声明的变量是hoge_p,hoge_p 的类型是“指向 int 的指针”。
int* a, b;
声明两个“指向int 的指针”?——其实不是printf("a = %p, b = %d\n",a, b);
int hoge[10];
这本身是不符合 “ 类型 变量名” 的的形式的(C语言就是这样乱的)
Java 在声明“int 的数组”时,通常写成 int[] hoge; 感觉更合理一些
关于main只有这两种形式
int main(int argc, char *argv[]) or int main(void)
更多精彩文章扫码关注 [ Allen有话说 ],专注于编程,职场,英语(外企)
C语言中指针是什么?的更多相关文章
- C语言中指针占据内存空间问题
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- C语言中指针和数组
C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之 ...
- C语言中指针*p[N], (*P)[N],及**p的区别
在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- 编程基础-c语言中指针、sizeof用法总结
1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...
- C语言中指针和多维数组
指针和多维数组 数组名是特殊的指针 数组是一个特殊的指针,多维数组也是更为复杂的数组,它们的关系是什么样的呢? 我们通过一个简单的例子来比较形象的了解指针和多维数组: int a[2][3]; 这是一 ...
- 对C语言中指针的一些新认识
学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的 指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...
- C语言中 指针和数组
C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象.与之相反,指针用来存储单个内存地址.数组和指针不是同一种结构因此不可以互相转换.而数组变量指向了数组的第一个元素的内存地址. 一个数组变 ...
- C语言中指针中的值赋值给数组
如果把各种语言做个冷兵器类比的话,C语言一定是刀客的最佳工具.入门很简单,但是要是能把它熟练运用,那就是顶尖级别的高手了. 用了那么多年的C语言,发现自己还是仅仅处于熟练的操作工.今天遇到了一个bug ...
随机推荐
- [转].gitignore文件不起作用的解决方案
.gitignore文件不起作用的解决方案 觉得有用的话,欢迎一起讨论相互学习~Follow Me 转载地址 https://www.cnblogs.com/liugp/p/10399282.html ...
- Python - Django - 中间件 process_response
process_response 函数是执行完 views.py 后执行的函数 process_response 函数有两个参数,一个是 request,一个是 response,response 是 ...
- 简单工厂(二)——coding
public abstract class Video { public abstract void produce(); } public class JavaVideo extends Video ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- Kubernetes平台环境搭建
软件 版本 Linux操作系统 CentOS7.4 Kubernetes 1.12 Docker 18.xx-ce Etcd 3.x Flannel 0.10 角色 IP 组件 推荐配置 master ...
- initramfs文件系统制作
源码下载:https://busybox.net/downloads/ 源码版本:busybox-1.30.0.tar.bz2 [ 源码编译步骤 ] make menuconfig ARCH= COM ...
- 【linux】查看端口占用情况
netstat -nlp | grep "端口号"
- 构建C1000K的服务器(2) – 实现百万连接的comet服务器
转自:http://www.ideawu.net/blog/archives/742.html 这是关于 C1000K 序列文章的第二篇, 在前一篇文章 构建C1000K的服务器(1) – 基础 中, ...
- Oracle RAC 创建实例出错(非+DATA目录)的简单处理
今天进行oracle的rac测试 发现开发同事没有写好 oracle rac的设置. 创建完之后就会报错了 因为自己对oracle 的RAC 不太熟悉 不太会用.. 所以用 一个比较简单的办法. a ...
- Jenkins服务使用 宿主机的docker、docker-compose (Jenkins 执行sudo命令时出现“sudo: no tty present and no askpass program specified”,以及 docker-compose command not found解决办法)
若要转载本文,请务必声明出处:https://www.cnblogs.com/zhongyuanzhao000/p/11681474.html 原因: 本人最近正在尝试CI/CD,所以就使用了 Jen ...