C指针
-
date_range 26/07/2019 00:00 infosort label
layout: post title: “C指针” date: 2019-07-26 12:35:13 +0800 categories: 笔记 tags: C语言 comments: 1
第1章:初始指针
指针:pointer,通过它找到以它为地址的内存单元。
指针有两种含义,一是作为数据类型,二是作为实体。
指针作为实体,用来保存一个内存地址的变量。
指针作为数据类型,可以从一个函数类型、一个对象类型或者一个不完备类型中导出。从中导出的数据类型称之为被引用类型
。
1.进入workspace工作目录,新建pointer文件
main.c文件的代码如下:
#include <stdio.h>
void change(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int a=5;
int b=3;
change(&a,&b);
printf("num a=%d \n num b=%d \n",a,b);
}
第2章:gdb调试工具的使用
2.1 gdb工具的使用
- 使用
$ gcc -v
查看版本号- 使用
$ gdb -help
查看gdb里面的帮助信息。 - 使用
$ cp main.c main2.c
拷贝一份代码,并修改。
- 使用
main2.c 中的代码如下:
#include <stdio.h>
void change(int a,int b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 5;
int b = 3;
change(a,b);
printf("num a=%d \n num b=%d \n",a,b);
}
- 使用
gcc -g main2.c -o main2.out
编译并进行调试- 使用
list
或l
列出main2.c中的代码 - main2.c中的代码显示不全,按一下回车,显示全部代码。
$ start
开始单步调试$ p a
打印a的值。$ n
跳到下一行。$ p b
打印b的值。$ s(start的缩写)
进入函数中的单步调试,这里指进入change().$ bt
查看函数堆栈。$ f 1
切换一个栈,这里指跳到a.$ l
查看列表。$ a
退出调试。
- 使用
2.2使用gdb调试案例
- 使用gdb调试main.out,调试步骤和上面一样,这里就不说了。
- $ p b 表示地址。
- $ p *b 表示地址的值。
第3章:指针与内存
3.1 计算机中的数据表示方法
在计算机中,用字节(Byte)来表示计算机的数据存储单位。1byte=8bit。
在电路中,通常有两种状态,通电用1表示,断电用0表示,计算机也是一样。
计算机用二进制表示,显示为十进制,编程用十六进制。一个十六进制的数字,就可以表示4位二进制数字。
3.2内存管理
32bit = 4G,地址总线是32位,也就是寻址空间是32位。
32位指的是:给内存编码只能编到32个二进制位,地址总线可以存在多种状态。
32————————-2的32次方个状态———4G
64bit ————2的64次方个状态
操作系统会对所有内存进行编号,编写唯一的内存字节的地址。
1个字节存放8个二进制位的数据,64位操作系统内存地址编号:
用二进制表示:64个1,64个0.
一个计算机中可能同时要运行多个程序,内存的占用不确定,不需要程序员自己管理内存。
main()函数就是所有函数的入口。
操作系统知道入口后,就能执行代码了。
程序就可以被调用了。
- 操作系统
- 除了能给内存做编号以外,还可以给内存做一定的规划。
- 在64位的操作系统中,程序员使用的内存只要有前面的48位就可以了。
- 用户内存隔离开的好处
- 操作系统的内存不会被大量占用
- 避免机器卡住、卡死、死机等状态。
- 可通过操作系统操作应用程序调用
- 使得操作系统更安全。
3.3变量和指针的本质