前言
个人觉得c语言学的是内存,而不是代码,当你在c语言中搞清楚这些,就为将来打下基础。
内存四区
1.代码区 : 存放代码。 2.全局区 : 全局的常量 ···· 例:字符串常量“abc” ···· static和auto的定义的全局变量。 3. 栈区 : 系统自动开辟,系统自动释放。(开辟的空间并不是很大) 4. 堆区 :动态开辟的内存,手动开辟,手动释放。(一般特大的)
一般情况下(32位)
- char ········· 1字节
- short ········ 2字节
- int ············ 4字节
- long ········· 4字节
- float ·········· 4字节
- double ······ 8字节
地址
把内存以单个字节为单位,分开对每一个字节编号,这个编号就是地址。
- 编号是连续的。
- 唯一的。
首地址
一段内存空间中第一个存储单元的地址
例 int a;
不难看出a占了四个字节,它的首地址就是100
-------------------------------------------------------------------------------------------------------------------------------------------------------
int a[5];
而数组a的首地址是a[0]的地址100
int a[3][3];
这个二维数组的首地址是a[0][0]
指针变量
- 用来存放地址的变量
- 内存大小为4B(根据操作系统定)
int *p; 定义一个指针变量p,存的是地址!! int指明指针指向的数据类型 *指明 p这个变量是一个指针变量
注意 int *p;与 * p 这两个是不一样的 定义指针变量的时候 int *p; *只是表明p是一个指针变量。 而在非定义的时候 *p,则表示为 取值运算符
&取地址运算符(单目运算符) *取值运算符。返回某一个地址中的指(单目运算符)
野指针
不能明确指向的指针变量。(危险) int *p;中的p保存的地址是随机的,一不小心刚好随机到重要数据就没了。 处理int *p = NULL;
指针变量的运算 自加加,自减减,加,减。
指针偏移,去访问地址旁边的一些内存。 指针变量的加减,以指针所指向的类型空间单位进行偏移。
char *p;
int *p1;
double *p2;
一维数组与指针
记得创建数组的时候记得初始化
- 定义一个一维数组,数组名是这个数组的 首地址
int a[5]; a指向 a[0], a 的类型就是 int* &a 这个地址指向整个数组 &a的类型 int(*)[5]; 例
int *a;
printf("a = %d\n", a);
printf("a+1 = %d\n", a+1);
printf("&a = %d\n", &a);
printf("&a+1 = %d\n", &a+1);
结果为 访问方式
- 下标法
- 指针法
- 其中指针法里又可以有 *(p+i)和 *p++
- 两者是不一样的,前者p的值始终保持不变,后者p的值运算一次就变一次
3 .数组名法 但是数组名a不可以*a++ ,因为数组名不能够随意改,会报错。 a=a+1 == a++
二维数组与指针
例:
int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 , 12 };
数组名:a
-
a是二维数组的首地址
a指向二维数组的第一个存储单元,也就是a[0];
a指向a[0] 这个一维数组的,a的类型是int (
)[4]; 所以a + 1 = a[1]; +16个字节。 a[0]指向a[0][0]; a[0]的类型是int
所以a[0] + 1 = a[0][0]; +4字节;
不要看它们的地址,要看类型,它们的地址都是一样的。
int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 , 12 };
printf("a = %d\n", a);
printf("a[0] = %d\n ", a[0]);
printf("&a[0][0] = %d \n", &a[0][0]);
printf("\n");
printf("a + 1 = %d\n", a + 1);
printf("a[1] = %d\n ", a[1]);
printf("&a[0][1] = %d \n", &a[0][1]);
查找m行n列的元素: a[m][n]; *(a[m]+n); ((a+m)+n);
int a[3][4];
名称 | 类型 |
---|
&a | int(*)[3][4] | a | int(*)[4] | a[0] | int* | a[0][0] | int |
结语
c语言是面向过程,通过指针我们就可以让c语言面向对象
|