一、普通变量
1.定义变量
int main(){ int a = 9; printf("%d",a); return 0;}
2.变量的内存结构
(如下图所示,数据被分为三段,第一段是变量的名称,第二段是指针,第三段是值)
3.定义新的变量,将变量赋值为a
int main(){ int a = 9; int b = a; printf("%d",a); return 0;}
4.总结
b = a是让b的第三部分等于a的第三部分,所以相当于b完成了一次深拷贝,b的值的改变对a没有影响!!
二、指针变量
指针变量相对于普通变量而言没有第一部分,所以指针节省内存!
int main(){ int a = 9; int *c = &a; //&符号相当于获取变量的第二部分 printf("%d",c); return 0;}
如果我们改变指针c的值,会让a的值发生改变
三、数组
1.基本的数组类型
基本的数组类型和上边一致,也是分为三个部分,但是我们不能改变数组的指向,所以这个地方相当于java当中的final类型。
int main(){ int arr[] = {1,2,3,4,5}; //只能在原地址 int brr[30];//这个默认值都是0 // arr = brr;在java当中我们可以这么干,但是在C语言当中不能这样干 return 0;}
指针类型的数组
#include <stdio.h>#include <stdlib.h>int main(){int arr[20];//这种只能在自己原地址改,内存三段式 int *arr2; //数组指针,由于计算机只指向数组第一个数据的地址,而第一数据是int类型的,所有写成int * arr2 = (int *)malloc(30 * sizeof(int));//这个地方可以通过如下方式获取值的原因在于,arr2默认指向的是数组当中第一个int类型的数据,后边//*(arr2 + 2)输出的是第三个int类型的数据 printf("%d",*(arr2 + 2)); //这种方式不常用//上下两个等价 printf("%d",arr2[2]); return 0;}
如何计算数组的长度
#include <stdio.h>#include <stdlib.h>int main(){int arr[20];//这种只能在自己原地址改,内存三段式 int *arr2; //数组指针,由于计算机只指向数组第一个数据的地址 ,而第一数据是int类型的,所有写成int * //sizeof是计算这个类型所占的空间 arr2 = (int *)malloc(30 * sizeof(int));//计算数组的长度。sizeof(arr):总长度; sizeof(int) 每一个元素的长度 int leg = sizeof(arr)/sizeof(int);// return 0;}
申请二维数组
#include <stdio.h>#include <stdlib.h>int main(){//申请指针类型的二维数组// 二维数组当中有5个一维数组 int **arr3 = (int **)malloc(5 * sizeof(int *));arr3[0] = (int *)malloc(10 * sizeof(int));arr3[1] = (int *)malloc(15 * sizeof(int)); return 0;}
三、结构体
在C语言当中没有byte类型和boolean类型,也就是剩下6中类型,除此与外还有结构体类型,我们声明一个结构体类型的变量默认是final修饰的,所以想要改变指针的,比如链表或者树这些数据结构,必须声明是指针类型的
#include <stdio.h>struct AAA{int a;struct AAA *next;//这个地方必须是指针类型的,不然无法改变指向}int main(){ int arr[] = {1,2,3,4,5};int brr[30];//这个默认值都是0 // arr = brr;在java当中我们可以这么干,但是在C语言当中不能这样干 return 0;}
1.普通形式
2.指针形式
#include <stdio.h>#include <stdlib.h> //使用malloc,必须加上这个struct AAA{int a;struct AAA *next;};int main(){s struct AAA aa;//创建实例,注意这种创建方式明显是三段式 struct AAA bb;//创建实例 struct AAA *cc; // 创建结构体指针,默认值为NULL// 给指针开辟内存空间 malloc():申请空间 sizeof(struct AAA):申请大小为结构体大小的空间// (struct AAA*) 根据这个结构对空间进行切分,以为上一步我们申请的是一个空白空间,所以要进行切分 cc = (struct AAA*)malloc(sizeof(struct AAA)); //利用指针去操作属性,记住使用-> cc->a = 88; cc->next = (struct AAA*)malloc(sizeof(struct AAA)); //指向并创建下一个节点 cc->next->a = 55; printf("%d",cc->a); printf("%d",cc->next->a); return 0;}
3.结构体的指针形式其实和java当中的对象相似。
方法内部无法改变其他方法的指针的指向。但是可以改变非指针类型的指向!
C语言解释
案例一:
如上图所示的输出,图示如下:
案例二:
4.申请结构体类型的数组
#include <stdio.h>#include <stdlib.h>struct AAA{int a;struct AAA *next;};int main(){ //申请结构体类型的数组 struct AAA *brr = (struct AAA*)malloc(5 * sizeof(struct AAA)); return 0;}