c语言 指针

作者&投稿:湛乐 (若有异议请与网页底部的电邮联系)
C语言 指针~

(1)如果a为int,也会返回64啊,赋值兼容,不会返回16的
(2)int **p; //指向指针的指针!
*p=new int *[40]; //执行完后p就是一个元素为指针的数组!
后面这句话有错误,应当改为p = new int *[40];
原因是类型不兼容

for (int i=0;i<40;i++)
p[i]=new int[60]; //为p数组中的每一指针分配内存,将其也变为一个个数组
后面这一句话有逻辑错误,原因是p并未初始化,必须先给p指向一个数组空间,再这样做
比如先p = new int * [40]; 再这样做就可以了,即使如此,p也并不是一个指针数组,含义只是p指向一个动态的指针数组,该数组的每个元素在循环中有指向另外的一个动态分配的一维数组

没有什么书是专门讲C指针的。只是某本书里C指针讲的比较多,比较深而已。并且在高级一点的语言,eg:java等语言,已经没有指针了。(或许上百的某些国外英文版教材会有吧)

如果想了解指针,可以参考《The C Programmking Language》(2ed),里面讲指针讲的比较好,也讲的比较深。
如果想了解指针底层的东西,可以看操作系统《深入理解计算机系统》和体系结构的书。

内存的基本单位是存储单元

一个存储单元占8bit,也就是1Byte

每一个存储单元都一个对应的地址

所谓地址,简单的将就是一个编号,可以理解为每个人的身份证号码一样

指针变量p和变量a的内存是在栈上创建的

两变量都占4Byte,即4个连续的存储单元

&p是指针p的首地址,也就是第一个存储单元的编号(地址)

&a是变量a的首地址,也就是第一个存储单元的编号(地址)

p = &a;的意思是将变量a的首地址赋给变量p,也可以说p保存了变量a的首地址

现在p和&a是一样的地址,那么相同的地址里所存放的内容自然也就一样

用*p或a就可以取该地址里所存放的内容

所以*p和a的内容是一样的

没有分配地址一说,只有分配内存,分配存储单元
地址,他的全称叫物理地址或逻辑地址,是由段基址和偏移量构成,由地址累加器合成物理地址,也就是说每一个存储单元都有一个对应的物理地址,他是规定好的,不存在分配,只有寻址一说
所谓寻址,就是指你所分配的内存的首地址,要看你的内存在什么上创建?(C语言有三种内存创建方式)是该内存的那一段?才能给你相应的首地址,也就是这块内存,这是由编译器决定的,不是你决定的
如果你有兴趣可以去学微机原理和编译原理,比较复杂,牵扯硬件和汇编,还有数电,它会让你更了解这些东西的
以你现在这个基础,只要记住我上面写的那些话就可以了,分清内存,存储单元,地址之间的关系就够了,其他的交给编译器去做,不需要你太多了解,慢慢去学,不可能一口是个胖子,这是一个过程

都分配空间,
这样说:
对a 因为他是与整形数据关联的,所以分配的时候相当于是给那个整形数分配的,如果整形数的表示用2个字节,那就分配两个字节的空间
而对于指针,可不能这样了。
实际上指针是个什么东西呢,是个通用变量,这个变量应该与定义a一样,也应该有个对应数据类型的,可是这个类型比较特殊,他对于谁来说都一样,就是不存你这个数据类型的数值,专门存你这个数据类型在内存中对应的存数值的那个单元的编号的(就是地址).
给你个比喻:你就理解了,比如宾馆,房间可以住人,而前台那些人可以登记你的房间号,现在a就相当于是住的人,而前台就相当于是p,这个p不记你是谁,光记门牌号,管你房间住的是什么人。
那这样,对于p来说,前面说的应该有个数据类型就没有意义了,扔了吧。那怎么区别记录的是哪个啊。那好说,我就用要记录的内存单元中存放的数值的数据类型就完了吗!
这就让p和a关联上了,
这样要是找a的值,(可以对应宾馆的人),我可以不直接用a(可以不知道人的名字,也就是不叫名了),我通过记录的你的位置的p,(也就是用记录的门牌号找人)来得到a的值。

因为内存单元的编号对哪种数据来说都是一样的。所以给p分配的时候那就统一按一个固定字段来分吧。只不过这个固定字段的空间不能放数值,只能是已经放值得内存单元的地址哦。而p和a是都占用单元的,也不在一个地方哦。

你定义了一个整型指针×p他是计算机随机给的一个地址空间(不一定是整型字节,可能是16位的或32位的根据计算机cpu来确定,这个你不必关心)这个地址空间内存放的是一个地址,并注明指向(地址)的是8位二进制数(整型)的。第一句INT *P完后p里面是一个不确定地址(随机的)。INT A=3;申请一个变量为A并将整型数常数3放在变量里。p=&a;&是取该变量地址的操作符,这句话完后p中就放着a的地址了。其结果是变量p中是变量啊的地址(有计算机分配)也就是p指向a。指针用在堆栈,和一些复杂结构中,指针可以++,--这只是对a的地址操作。

如果你定义的全局变量,编译时会把静态存储区的内存分配给他.如果你定义的是局部变量,将把堆栈区内存分配给变量.具体什么是静态存储区,堆,栈百度下就知道了.在你这里先为p分配一个内存,由于p是一指向整形的指针类型.所以分配给p的空间大小是2个字节.即16位.然后再给a分配整型大小的内存空间2个字节..最后一步p=&a;这条语句是将a分配到的内存地址赋值到p中..这步后指针p中就保存了a在内存中的地址.从而实现了p指向a.

int *p; // 给P分配四个字节,用于存放其它变量地址;
int a=3; // 给a分配四个字节,用于存放初值3
p=&a; // 把a的地址送入p
这很简单的。


万源市17892227648: C语言中指针是什么? -
商夜安必: 1.指针就是1个变量,他也是一个存放内容的内存空间. 2.指针存放的内容是另一个内存空间的起始地址.不同于一般变量存放的就是变量值. 3.取值操作符*对于指针的作用是取得指针变量存放的内存地址里面的值,不加*取出的是指针变量存放的值(就是一个内存地址)上面3步,step by step 你就理解了.

万源市17892227648: C语言中的指针是什么!详细说明! -
商夜安必: 指针是C语言中广泛使用的一种数据类型.运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序.指针极大地丰富了C...

万源市17892227648: C语言中的指针是什么意思? -
商夜安必: 指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存(Register).指针一般出现在比较近机器语言的语言,如汇编语言或C语言.面向对象的语言如Java一般避免用指针.指针一般指向一个函数或一个变量.在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值. 大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是c语言的灵魂,一点都不为过.简单比方……比如你是一个变量,那么你家的地址就相当于是你的指针, 我可以通过找到你家地址而找到你.

万源市17892227648: C语言中的指针是指什么? -
商夜安必: C中指针,其实就是“地址”;比如 int a1 = 10; int * pa = &a1; a1是一个int型的整数.它的值为10,假设它自己的地址是0000, pa是一个指针型的数据,本身是一个4字节长度的 指针数据类型.它自己的地址假设为1111,它的值被设置为a1的地址0000,我们就说pa的值是0000,pa指向a1,用取值符号*,*pa就可以得到a1的值10.

万源市17892227648: C语言指针基本概念及其指针变量的定义是什么 -
商夜安必: 指针是常见间接访问方式.指针就像一个快捷方式,它指向内存的一个地址,可以通过指针就可以间接的访问到数据.对于计算机,访问内存的方式有两种,直接访问和间接访问.直接访问通过就是通过变量名称去访问.指针概念是构成C/C++的...

万源市17892227648: C语言里的指针是什么意思,起什么作用 -
商夜安必: 1:指针是一个地址,指向的是个类型: 我们知道,c语言中的类型有int,char,bool(这个不常用),一般我们使用int,char就可以满足一般的类型需求的,如果对于变量的长度过大,就是用long ,float,double,关于各个类型使用的的长度问题,可以使...

万源市17892227648: C语言指针! -
商夜安必: 一句话,指针即地址.char* p; char c; p=&c; 给p分配四字节单元,给c分配一字节单元,p中存放c单元地址,c中存放字符.*p,就是访问p单元,即c的地址.

万源市17892227648: C语言的指针是什么
商夜安必: 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.

万源市17892227648: c语言中指针怎么用 -
商夜安必: c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是c语言的灵魂,一点都不为过.指针就是地址.计算机中的内存都是编址的,就像你家的地址一样.C 中函数调用是按值传递的,传入参数在子函数中只...

万源市17892227648: 求C语言中指针的用法 -
商夜安必: 电脑程序中,不管是什么东西,他都对应有一个地址,而指针的作用是指向这个地址.例如int a=0; a的内容是0,但是在电脑中的内存地址就是其他,假如是2000,那么指针指向的就是这个2000的值.继续刚才的例子int *p;p=&a;这个时候p就指向了a的地址2000,如果想借助p来访问a,就需要在p前面添加上*号,如*p的内容就是0了,也是a的内容.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网