C 语言指针:
c 语言函数内的变量也是局部变量,函数内调用其他函数所传值被改变后不会对原函数变量产生影响。
实参前加上&,形参前加上*,表示指针
使用 gdb 工具进行单点调试
| gcc -g main.c -o main.out | 将文件转成可支持 gdb 调和斯的文件格式 |
|---|---|
| gdb ./main.out | #执行调试文件 |
| l (list) | #显示源代码 |
| enter | #继续执行上一条命令 |
| start | #开始调试 |
| p/print | #打印对应的值 |
| n | 继续下一行代码 |
| $1/$2/$3 | 代表第一第二第三执行结果 |
| s | #进入函数内部 |
| bt | #查看函数堆栈 |
| f 1 | 切换到 1 函数 |
| x/3d |
从某内存地址开始按照十进制类型连续显示三位 |
| q | 退出调试模式 |
计算机中数据的表示方法:
计算机中一般以 16 进制数来自动分配保存的地址 一个十六进制数等于四个 2 进制的数 内存分层| –|– 系统内核|#用于给系统自己处理的内存空间:24 个 16 进制字节 栈内存 |#系统自动分配当执行代码程序时,需要在栈内分配 数据的内存 | 自由分配区 | #用于个人处理数据自由分配的空间 堆 | #一般有程序员分配释放,或程序结束时有 os 回首,分配方式类似与链表 数据段 | #用于存储 global const
指针和内存的实质:
//有指针
#include <stdio.h>
void change(int *a,int *b)
{
int num = *a;
*a = *b;
*b = num;
return 0;
}
int main ()
{
int a=5;
int b=3;
change(&a, &b);
printf("a=%d \n b=%d \n",a,b);
}
输出 3,5
//无指针
#include <stdio.h>
void change(int a,int b)
{
int num = a;
a = b;
b = num;
return 0;
}
int main ()
{
int a=5;
int b=3;
change(a,b);
printf("a=%d \n b=%d \n",a,b);
return 0;
}
输出 5,3
内存中各个类型的内存大小:
在分配地址中,编译器会进行内存分配优化,会将所有同类型的分配在相邻;
- 整型类型: 32 位 b 4 字节;
- 64 位系统下指针内存地址会占 64 位 b 8 字节;
- 32 位系统下指针内存地址会占 32 位 b 4 字节;
数组指针和字符指针:
直接查看整个数组的指针,会显示数组中第一个元素的指针地址
字符指针:指针字符无法修改值因为其地址是位于代码段推栈内存可更改,代码段存储程序编译后得到的机器码,不允许更改
指针的运算:
| 操作 | 作用 |
|---|---|
| 指针加: | #会先判断指针下的值是什么类型,然后在根据类型所占空间大小增加字节位数; |
| 指针偏移: | p 代表指针; p+=3; 代表讲指针 p 向下移动三位(每位的字节数会根据数据类型进行变化)!; |
注意:
-
linux gcc 可使用&& 符号链接命令,等前方的命令成功后再执行后方命令
-
使用 echo &?可得到 main 函数 return 的值
-
int 整形占 4 字节 char 为字符串 float 为浮点数
-
C 语言指针语法 int a=&b; //前加 & 取地址符
-
32 位系统地址总线是 32 位也就是寻址空间是 32 位 指给内存编号只能编到 32 个二进制位
- 用户内存隔离开的好处: 1.操作系统内存不会被大量占用 2.避免机器卡住,卡死,死机等 3.可通过操作系统吧应用程序关闭使操作系统更安全
- C 语言语法不允许直接操作代码段
本文由 倪建成学习时 编辑,只是普通笔记。若是对你有用,可以自行转载
最后编辑时间为:2019-07-21 00:00:00