menu

C指针

  • date_range 26/07/2019 00:00 info
    sort 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编译并进行调试
    • 使用listl列出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变量和指针的本质