关于定义一个指针与指针变量

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个字节。

 

时间: 2024-11-15 20:19:20

关于定义一个指针与指针变量的相关文章

c++-在头文件里定义一个string name; 变量,编译报错

问题描述 在头文件里定义一个string name: 变量,编译报错 //Parent.h class Parent { public: Parent(void); ~Parent(void); private: string name; }; //main.cpp #include #include #include "Parent.h" using namespace std; void main() { system("pause"); } //Parent.

vb.net定义一个date类型的变量但赋值给了一个string类型的数值,怎样转换

问题描述 vb.net定义一个date类型的变量但赋值给了一个string类型的数值,怎样转换 代码如下,怎样把"00:00:00"字符串转换为date类型,使数值一致 Optional ByVal iPrintTime As Date = "00:00:00" 解决方案 没有日期,那么你得假定一个日期 s = "00:00:00" Dim dt As DateTime = DateTime.Parse(DateTime.Now.ToString

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

指针-如何定义图中的这个变量?

问题描述 如何定义图中的这个变量? p++ 可以移动到下一个字符串. 105 解决方案 可以使用指针数组(指针数组中的每一个元素均为指针) #include<stdio.h> void main() { char *arr[3] = {"abcde", "1234", "42"}; char **p = &arr[0]; for(int i = 0; i < 3; i++, p++) printf("%s &q

一个现成的二维数组,如何定义一个 指针的指针 来指向这个二维数组?

问题描述 一个现成的二维数组,如何定义一个 指针的指针 来指向这个二维数组? 例:这样一个数组,想定义一个指针的指针,指向它. int arr1[4][4] ={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; ps. 这个指针的指针 是 用来传递个函数的. 因为某种要求,需要向函数传递一个二维数组,函数的形参表中定义了 int **. 因此 这个指针的指针一定要能够传递函数,并且函数能够通过它操作二维数组元素. 解决方案 指向二维数组的

c-如何定义一个自增之后在二维数组中移动到下一行的指针?

问题描述 如何定义一个自增之后在二维数组中移动到下一行的指针? 如何定义一个自增之后在二维数组中移动到下一行的指针?如何定义一个自增之后在二维数组中移动到下一行的指针? 解决方案 自增是不能移动到下一行的,自增实现的是++, 解决方案二: 用二重数组,比如 int ** arr; arr += 第一维长度; 解决方案三: int a[m][n]={""}; *a+1;表示下一行; *(a+1):表示下一个元素位置. 若果now<n,移动到x行的当前位置:a[m*x+now]. 解

c程序设计-C语言截结构体指针中的变量又是另一个结构体指针,怎么用,代码运行不了

问题描述 C语言截结构体指针中的变量又是另一个结构体指针,怎么用,代码运行不了 #include #include #include #include #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的分配增量 typedef struct { int No; char name[10]; }Student; typedef struct { Student *elem;//存储空间基址 int

c-定义一个数组存放数据和定义一个指针存放东西有什么区别

问题描述 定义一个数组存放数据和定义一个指针存放东西有什么区别 定义一个数组存放数据和定义一个指针存放东西有什么区别,u8 a[]="adflkadjflkdjf"和u8 *b="adakkjfakdhflkd"这两种格式是一样的吧,但是当需要定义一个存储空间是可以用数组,U8 c[20],但是没办法用指针实现吧 解决方案 后者"adakkjfakdhflkd"在常量区,不能修改. 解决方案二: 如何动态定义一个 对象指针数组 解决方案三: 你可

指针、指针变量与内存空间——解惑

指针.指针变量与内存空间--解惑              一年前,我曾今在ChinaUnix写过一篇博客<关于定义一个指针与指针变量>然后搬家来了CSDN.这篇博客中写道了很多关于指针和指针变量以及空间分配的一些常见错误.但是,到现在为止,无论是CSDN的网友还是一些已经工作的同事以及大三大四的学生,陆陆续续的有人在问我关于指针与指针变量还有空间分配问题.我想在这里再写一篇博客解惑指针     问题1 int idata = 5; int *p = idata//为什么这里不对? 既然通常*