c语言 | 总结

结构体

建立一个结构体类型时,并不分配内存空间。
struct sdudent{
int num;
char name;
};
此时建立一个struct stdent结构体类型,就相当于int类型。
定义结构体变量时,会分配内存空间。
接上,定义结构体变量student1:
struct student student1;
与int a;同理。

?:定义结构体指针为什么还用malloc()分配内存空间?
~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~
我们完全可以撇开结构体,把问题简单化成int类型来说明这个指针问题:
int a1[10];
int a2;
很容易知道,a1是包含10个int的数组,大小也就是10
sizeof(int)。我们可以直接使用a1不要在进行什么初始化或者分配空间的游戏,因为数组a1里面本身存放的就是int变量本身了。然后a2,是一个int的东西,也就是整型指针,a2不能存放int变量,它只能存放地址,一个int变量的地址。如果要使用a2,必须首先对a2初始化,即将它指向一个int变量的地址,如:a2 = (int)malloc(sizeof(int));或者int i = 10;a2 = &i;
所以,malloc函数的作用是首先声明一个变量,然后返回该变量的地址。
所以:a2 = (int*)malloc(sizeof(int)) 的含义就是把该变量的地址赋值给a2,和a = &i 本质上并没有什么不同,只是一个变量是栈上,一个是堆上,都是一个地址赋值。
————————————————
版权声明:本文为CSDN博主「代码搬运工233」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dreamzuora/article/details/54377197
~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~
综上,结构体指针用malloc()动态分配内存空间其实是为所定义的结构体指针赋值 ,因为先只是定义了结构体指针(struct student* p),此时分配内存空间为指针的内存空间(32位系统一般指针所分配的空间均为4个字节),但是还没赋值,所以用malloc()声明一个结构体变量(表示为*p),然后返回该变量的地址给所定义的结构体指针p。

?:结构体名与结构体类型名,可以一样吗?

[图片源于] (https://blog.csdn.net/u013951778/article/details/49282097)

指针

计算机中的内存都是编址的,每个地址都有一个符号,就像家庭地址或者IP地址一样。在C语言的多数实现中,指针值等同于一个无符号整数(unsigned int,因不致歧义,下简称“整数”),它是一个以当前系统寻址范围为取值范围的整数。声明一个无符号整数并使它的值等于对象的地址值,实质上也能使之有指针的作用。

int a = 10,*pa=& a;
刚开始的时候,pa 指向 a 的开头,通过 *pa 读取数据时,从 pa 指向的位置向后移动 4 个字节,把这 4 个字节的内容作为要获取的数据,这 4 个字节也正好是变量 a 占用的内存。
指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法、减法、比较等。指针变量加减运算的结果跟数据类型的长度有关,而不是简单地加 1 或减 1。
如: int a = 10, *pa = &a, *paa = & a;
double b = 99.9, *pb = & b;
char c = ‘@’, *pc = & c;
执行: pa++; pb++; pc++;
pa -= 2; pb -= 2; pc -= 2;后
从运算结果可以看出:pa、pb、pc 每次加 1,它们的地址分别增加 4、8、1,正好是 int、double、char 类型的长度;减 2 时,地址分别减少 8、16、2,正好是 int、double、char 类型长度的 2 倍。
数组中的所有元素在内存中是连续排列的,如果一个指针指向了数组中的某个元素,那么加 1 就表示指向下一个元素,减 1 就表示指向上一个元素,这样指针的加减运算就具有了现实的意义。不过C语言并没有规定变量的存储方式,如果连续定义多个变量,它们有可能是挨着的,也有可能是分散的,这取决于变量的类型、编译器的实现以及具体的编译模式,所以对于指向普通变量的指针,我们往往不进行加减运算,虽然编译器并不会报错,但这样做没有意义,因为不知道它后面指向的是什么数据。
指针变量除了可以参与加减运算,还可以参与比较运算。当对指针变量进行比较运算时,比较的是指针变量本身的值,也就是数据的地址。如果地址相等,那么两个指针就指向同一份数据,否则就指向不同的数据。不能对指针变量进行乘法、除法、取余等其他运算,除了会发生语法错误,也没有实际的含义。

#include <stdio.h>
main()
{
char *pT;
char t=‘h’;
pT=(char *)1245048;
putchar(*pT);
}
加上(char * )是因为毕竟int 和char * 不是一回事,需要强制转换,否则会有个警告。因为char *声明过的类型,一次访问1个sizeof(char)长度,double *声明过的类型,一次访问1个sizeof(double)长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值