C语言那点事儿~

软件和网站开发以及相关技术探讨
维尼熊
帖子: 1
注册时间: 2016-01-31 0:46
系统: Ubuntu 14.04 LTS

Re: C语言那点事儿~

#76

帖子 维尼熊 » 2016-01-31 0:49

通俗易懂,特来回复。
头像
懒蜗牛Gentoo
论坛版主
帖子: 7353
注册时间: 2007-03-02 17:36
系统: Linux Mint

Re: C语言那点事儿~

#77

帖子 懒蜗牛Gentoo » 2016-02-05 21:46

“指针啊,这个简单。我给你讲讲啊。你比如说有个int型的变量,长度4个字节。恩,咱就不说特殊情况了,就说32位x86平台,int是4个字节。”
“恩,我知道。”
“这个int型的变量存在内存里边,占用四个字节,这四个字节的值是0xFFFFFFFD,那么这个数是多少?”
“-3,这个我知道。取反加一表示负数。”
“恩,好。那么,如果是个unsigned int型的数据,长度还是4个字节,他在内存中的值还是0xFFFFFFFD,这个数是多少?”
“那就是……我算算啊……4294967293”
“恩……就当你说的是对的。我懒得掏手机算了。其实我想说的就是,内存里存的数据相同,但其实它所表达的意义不同,这因为他们的数据类型不同。”
“恩”
“那么比如一个int型变量,值是0x87654321,那么他……”
“哎呀,反正表示一个负数,我就不算了。如果是unsigned int就是个挺大的正数”
“恩,如果是个指针呢?”
“厄……不知道。”
“如果是个指针,那么这个0x87654321就是个地址。内存里的一个地址”
“哦……然后呢?”
“没了,指针其实就这么简单。比如我写int * p = 0x87654321,那么我们就在内存里有了一个4字节的变量,这个变量的值是0x87654321,它指向内存中的另一个地址。”
“恩,好像知道了,然而这有什么卵用?”
“靠!卵用?没有了指针,c语言就不是c语言了。”
“你就说怎么用吧,为啥要指向内存里的另一个地址?”
“当然是为了操作那个地址上的数据了。比如刚才那个指针定义后,我如果写 *p = 0x00,意思就是‘把p这个指针所指向的那个地址的位置当做一个变量,给他赋值为0.’”
“那地址上其实有变量么?”
“可能有,可能没有。”
“没有怎么办?”
“怎么办?不怎么办啊,本来就不需要有变量,通过指针就能操作了。”
“哦,那就是说*p=0这句,酒吧0x87654321这个地址上的那一个字节给写成0了?”
“不是一个字节,是从0x87654321这个地址开始的4个字节。”
“为什么?”
“因为我定义的是int *p,意思就是‘p是一个指向int类型数据的指针’。那么*p就相当于一个int型的变量,操作起来就都是4字节的操作。”
“哦……这样啊。那如果是char * p 的话操作的就是一个字节了?”
“恩,你终于开点窍了。”
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: C语言那点事儿~

#78

帖子 月下叹逍遥 » 2016-02-05 22:42

:Music
浮生七十今三十,从此凄惶未可知
头像
懒蜗牛Gentoo
论坛版主
帖子: 7353
注册时间: 2007-03-02 17:36
系统: Linux Mint

Re: C语言那点事儿~

#79

帖子 懒蜗牛Gentoo » 2016-02-05 22:46

今天就写这么点了 :Grimace
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事
回复