Hackerchai IT Blog
10分钟解惑C语言指针
10分钟解惑C语言指针

前言

最近才在备战OI,我之前对C指针的理解是:指针本身是一块内存,它保存了一块内存的地址,但是经常对一些概念有混淆,于是今天就细致的研究了一下指针的详细用法和原理。

指针

先看这样一段代码:

输出结果为:

这就是指针的基本使用,可用下图来说明:
https://cdn.blog.hackerchai.cqunia.com/wp-content/uploads/2014/12/1-246x300.png

指针与数组

首先看这两个声明语句

第一个是声明了一个指向有100个char元素的数组的指针(注意和指向数组首地址的char型指针分开);第二个是声明了一个有100个char*元素的数组,数组里面装的是char *。
为了理解,我们来看这样一段代码:

这端代码运行后结果如下:

因为内存是线性的,C中所谓的二维数组不过是数组的数组,arr这个数组有10个元素,每个元素是一个长度为100的数组,在程序员的脑子里面,arr是一个有10行100列的二维数组。

代码里的p是一个指向int型的指针,q是一个指向“有100个int的int数组”的指针。所以p和q的初始化方式是不同的,但是开始的时候他们都指向了arr这个数组的数组的首地址(初始时是相等的),但是到后面分别执行自增操作之后,因为它们的类型不同,因此根据指针自增运算的含义,他们移动的步长也不相同,p移动了sizeof(int)个字节,而q移动了sizeof(int[100])个字节,于是它们的值也大不相同,可以用下图来说明:
https://cdn.blog.hackerchai.cqunia.com/wp-content/uploads/2014/12/2-226x300.png

另外要注意的就是字符二维数组的声明:

输出结果显然

以上是合法的字符二维数组的声明,str是一个有两个元素的数组,每个元素的类型是一个char*,结合上面所讲的,应该不难理解。

#通过函数指针调用函数
还是通过一个例子来说明问题:

注意用“&函数名”和“函数名”初始化一个函数指针都是合法的,因为C中函数名会被转换为指向这个函数的指针。

本人平时打OI,指针真的用的少之又少,今天算是给自己科普一下

赞赏
除部分转载作品已注明出处和原作者之外,本博客原创文字图片均采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。欢迎非商业网站使用,转载请注明原文作者和超链接。 商业用途,请事先联系,并支付稿酬,注明原文作者。 谢谢

发表评论

textsms
account_circle
email

  • https://secure.gravatar.com/avatar/2eaae7f808bdf6fafced9f234d94eafc?s=80&d=identicon&r=g

    These topics are so conunsifg but this helped me get the job done.

    4年前回复
  • https://secure.gravatar.com/avatar/?s=80&d=identicon&r=g
    tt

    非常好

    4年前回复
  • https://secure.gravatar.com/avatar/86fe82ecdf279a703f6a12bd2bec5214?s=80&d=identicon&r=g
    outlook

    这种表达方法不完全对。中文有楷书、宋体、草书等等,英文有粗细、圆润等区分,再加上每个字的大小如何控制。实际上最早的电脑是 atanasoff-berry ,之前有教科书骗我们说是 ENIAC 。假设历史上没有阿拉伯数字(其实是印度人发明的),我们可能说“机器语言是零一零一”,或者“Computers’ language is ‘zero one zero one’”。正确的说法是“机器语言是高低电压”,切勿被别人骗了!那么字体被安装进电脑之前,屏幕是无法和人类对话的,所以 C/C++ 指针最好不要说 p的地址:1439276008 ,差点就骗了别人。十五世纪已经有字体了,所以打印机、照相机出现得非常早,当时还没有 C/C++ Java Python .

    5月前回复

Hackerchai IT Blog

10分钟解惑C语言指针
前言 最近才在备战OI,我之前对C指针的理解是:指针本身是一块内存,它保存了一块内存的地址,但是经常对一些概念有混淆,于是今天就细致的研究了一下指针的详细用法和原理。 指针 先…
扫描二维码继续阅读
2014-12-12
标签云
归档