关于定义一个指针与指针变量
2010-02-07 21:52
260 查看
struct stat st;
struct stat *st;
【就事论事的解释】
struct stat *st;
是定义了一个stat结构体的指针,
这句话的重点在于是“指针”,其本质上,(在32位的体系结构中)也就是一个32位的数而已。
对于名称和实体来说:
名称:
一个名字叫做st指针
实体:
内存里面,也只有一个32位的空间,来存放这个指针。
struct stat st;
定义饿了一个stat类型的结构体,名字叫做st。
这里的重点是“结构体”,其根据结构体具体定义的不同,占用不同的物理空间大小。
这里的名称和实体:
名称,是一个叫做st的结构体。
实体:
就是一个结构体,结构体有多大,st就占用了多大的物理空间。
也就是说,比如你的结构体很复杂,比如所有成员空间加起来,有80字节,那么,这个st实际就占用了80个字节的大小。
【为何容易犯错】
意思解释完了,说一下为何会犯这样的错误,
我们是定义了这个:
struct stat *st;
但是,实际只是定义所需要的结构体的指针,而不是实际结构体本身。
举个例子,结构体好比是一个房间。
不同类型的房间大小不同,占用的物理空间也不一样。
结构体的指针,好比一个房间的一把钥匙。
不论其所相关的房间的大小,钥匙,始终只占钥匙这么大一点的空间(默认,可以理解为4个字节,32位)。
我们之所以犯这样的错,归根结底,都是太“贪”了,以后弄了个指针(钥匙),系统就会自动给你分配好了,
指针所指向的东西(别人就会给你个房子。。。)。
【引申】
以后不论你在别处再看见类似的指针,
不管这把钥匙可以开的是,一个小房间,还是一栋别墅,还是一个汽车,还是一个玩具车,
它都只是一把钥匙而已,只是这么大而已。物理上分配的空间也都是32位而已。
记住,如果你没有得到其他的房子或汽车,而只是弄了把钥匙。除非你买了房子(自己申请一个结构体),否则,没人会白白送你房
子的(系统不会理会你这个指针指向哪里,更不会自己另外给你分配一个结构体)。
如果还没完全理解,那么教个最简单的方法,只要记住这个就好了:
钥匙 = 32位 = 4字节
这样,你就不会搞混淆了。
【后记】
如果都只是弄把钥匙,就都有了房子车子,那么现在就不会有这么多为买房买车而郁闷的了,
直接去几元钱复制一把就好了。。。
个人理解:
同样,结构体是如此,在定义其他类型也是一样
char *str1;
char str2[20];
这么定义之后,我们只传给str1一直指针,而不能给str1传一个字符串。
在定义之后这样使用:
sprintf(str1,"....",..);
那么,这样相当于往str1里面装东西,但是str1在内存中是一个地址(可以看做一个数),那么str1在内存中只占1个或2个字节(实际根据OS来定)。把一个字符串往str1里面装,就会出现Segment fault段错误。
非要这样做,那就需要用malloc给sr1申请空间。
但是这样是合法的:
char *str1="asdfg";定义并初始化,系统会给str1分配一个连续的空间放这个字符串,字符串的首地址放在str1中。
str1[20]在内存中那个,不管你是不是用,它都会有20个字节。
struct stat *st;
【就事论事的解释】
struct stat *st;
是定义了一个stat结构体的指针,
这句话的重点在于是“指针”,其本质上,(在32位的体系结构中)也就是一个32位的数而已。
对于名称和实体来说:
名称:
一个名字叫做st指针
实体:
内存里面,也只有一个32位的空间,来存放这个指针。
struct stat st;
定义饿了一个stat类型的结构体,名字叫做st。
这里的重点是“结构体”,其根据结构体具体定义的不同,占用不同的物理空间大小。
这里的名称和实体:
名称,是一个叫做st的结构体。
实体:
就是一个结构体,结构体有多大,st就占用了多大的物理空间。
也就是说,比如你的结构体很复杂,比如所有成员空间加起来,有80字节,那么,这个st实际就占用了80个字节的大小。
【为何容易犯错】
意思解释完了,说一下为何会犯这样的错误,
我们是定义了这个:
struct stat *st;
但是,实际只是定义所需要的结构体的指针,而不是实际结构体本身。
举个例子,结构体好比是一个房间。
不同类型的房间大小不同,占用的物理空间也不一样。
结构体的指针,好比一个房间的一把钥匙。
不论其所相关的房间的大小,钥匙,始终只占钥匙这么大一点的空间(默认,可以理解为4个字节,32位)。
我们之所以犯这样的错,归根结底,都是太“贪”了,以后弄了个指针(钥匙),系统就会自动给你分配好了,
指针所指向的东西(别人就会给你个房子。。。)。
【引申】
以后不论你在别处再看见类似的指针,
不管这把钥匙可以开的是,一个小房间,还是一栋别墅,还是一个汽车,还是一个玩具车,
它都只是一把钥匙而已,只是这么大而已。物理上分配的空间也都是32位而已。
记住,如果你没有得到其他的房子或汽车,而只是弄了把钥匙。除非你买了房子(自己申请一个结构体),否则,没人会白白送你房
子的(系统不会理会你这个指针指向哪里,更不会自己另外给你分配一个结构体)。
如果还没完全理解,那么教个最简单的方法,只要记住这个就好了:
钥匙 = 32位 = 4字节
这样,你就不会搞混淆了。
【后记】
如果都只是弄把钥匙,就都有了房子车子,那么现在就不会有这么多为买房买车而郁闷的了,
直接去几元钱复制一把就好了。。。
个人理解:
同样,结构体是如此,在定义其他类型也是一样
char *str1;
char str2[20];
这么定义之后,我们只传给str1一直指针,而不能给str1传一个字符串。
在定义之后这样使用:
sprintf(str1,"....",..);
那么,这样相当于往str1里面装东西,但是str1在内存中是一个地址(可以看做一个数),那么str1在内存中只占1个或2个字节(实际根据OS来定)。把一个字符串往str1里面装,就会出现Segment fault段错误。
非要这样做,那就需要用malloc给sr1申请空间。
但是这样是合法的:
char *str1="asdfg";定义并初始化,系统会给str1分配一个连续的空间放这个字符串,字符串的首地址放在str1中。
str1[20]在内存中那个,不管你是不是用,它都会有20个字节。
相关文章推荐
- C++ 关于在一个类中定义另一个类的指针与对象
- 关于一个C语言的笔试题(数组+指针)
- 由“一个关于指针的小问题”想到的:常量指针与指向常量的指针
- 关于指针的一个面试题
- CSDN论坛中一个关于数组指针的讨论帖
- 关于C++指针的一个问题
- 关于static指针的一个严重问题
- 编写程序定义一个vector 对象,其每个元素都是指向string 类型的指针,读 取该vector 对象,输出每个string 的内容及其相应的长度。
- 一个关于JavaScript引用数据类型指针的小题
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- 一个简单的关于函数指针的实例
- C语言中“指针”和“指针变量”区别及定义
- 一个关于指针的问题 int (**def)[3]的解析
- 关于数组的a和&a的区别:一个是普通的指针,一个是数组的指针
- (转载和原创)关于解决C++“error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- 一个关于指针数组的例子
- 关于帧指针和栈指针的定义
- 关于指针的一个小程序
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- 关于指针的一个小程序