C语言指针与内存

  • 初始指针
    使用指针来进行交换值
#include<stdio.h>
void change(int *a,int *b){
    int tmp=*a;
    *a = *b;
    *b = tmp;
}
int main(){
    int a=5,b=3;
    change(&a,&b);
    printf("num a = %d\nnum b = %d\n",a,b);
    return 0;
}```
- gdb调试工具
`brew install gdb`
调试的时候,生成可以调试的版本,`gcc -g main.c -o main.out`
`gdb ./main.out`对程序进行调试,Mac里面必须是这样`sudo gdb ./main.out`才能对程序进行调试。
`l`列出源代码,按回车继续刚才的命令
`break 12`断点放在12行
`start`单步调试
`n`下一步
`p a`打印出a的变量值
`q`退出
`s`进入函数里面
`bt`查看函数堆栈
`f 1`跳到1这个栈里面
- 计算机中的数据表示方法
计算机中内存中最小单位是字节,1Byte字节=8bit位
- 内存管理
操作系统统一管理,32bit系统,最大使用4G内存,由寻址空间决定的,地址总线是32位,寻址空间是32位,也就是给内存编号只能有32位。
地址总线可以存在多种状态,2^32个状态,所以就是2^32字节,4GB,64位操作系统,64位的地址总线,所以内存足够了,操作系统会给内存地址进行编号,编号就是唯一的内存字节的地址,一个字节存放8个二进制位的数据。
64位操作系统中,用户应用程序使用的内存只要有前面的48位就够了,其他的内存空间是给操作系统内核使用的
高位内存:系统内核->栈->堆->数据段->代码段:低位内存
代码编译后的二进制数据加载到内存中,代码段
声明的全局变量和一些常量在数据段
中间的区域是自由可分配的内存
- 变量和指针的本质
静态变量,静态局部变量,作用域是当前函数,从定义位置,到其所在的{}结束位置,生命周期是从程序运行到程序退出,贯穿整个运行时间,下次函数调用的时候,静态局部变量不会再次初始化,而是沿用上次函数退出时的值。
静态全局变量,作用域为当前文件,从定义位置到文件结尾,声明周期为从程序运行到程序退出,贯穿整个运行时间,但是动态全局变量的作用域是整个项目,即最终编译成可执行文件的所有文件均可以使用动态全局变量。
C语言语法是不允许直接操作代码段的,代码段也是有地址的,除了代码编译后存在代码段外,代码的状态信息是存在内存的栈区域。
C语言是强类型,静态类型的。
变量的本质是一个代号,标识符,代表的是某个地址空间
指针本身也是一个变量,保存的数据是地址,指针变量的地址也就是指针的指针。指针的本质是保存内存地址。
- 操作系统对内存的管理
编译器的优化功能,对源代码进行优化,将同一类型的变量内存地址分配在一块,使得程序执行更快。64位系统中指针是8个字节,因为地址总线是64位的。
栈的内存空间保存了程序运行时候的状态。
代码段的内存地址是向上增长分配的,然后栈段的内存地址是从大往小进行分配的。
- 函数栈以及数据段内存
栈里最先分配地址的函数内存地址更大一些,静态变量,常量还有全局变量默认是在数据段中,静态变量属于某个函数特定的,一个函数被多次调用,但是都在数据段中。
- 函数指针与指针指向的数据访问
`int (*pquadrate)(int a) = &quadrate;`定义一个函数指针
`int s = (*pquadrate)(a);`使用这个函数指针,()表示地址指向某个函数整体,然后后面调用传参数a。如果指向栈内存,数据段内存表示直接去变量里面的值,指向代码段,就是一片代码块。
- 示例代码

include<stdio.h>

int global = 0;
int rect(int a,int b){
static int count = 0;
count++;
global++;
int s = a * b;
return s;
}
int quadrate(int a){
static int count = 0;
count++;
global++;
int s = rect(a,a);
return s;
}
int main(){
int a = 3;
int b = 4;
int *pa = &a;
int *pb = &b;
int pglobal = &global;
int (
pquadrate)(int a) = &quadrate;
int s = quadrate(a);
printf("%d\n",s);
}```

  • 数组申明的内存排列
    x/3d 0x7fffffffde14从这个地址开始显示3个十进制,默认是按照4字节显示
    这里经过gcc优化,b的地址在最前面,其次是a,但是i的地址在$10 = (int *) 0x7fff5fbffc54, b的地址$9 = (int *) 0x7fff5fbffc60,a的地址$8 = (int *) 0x7fff5fbffc64,array的地址$12 = (int (*)[3]) 0x7fff5fbffc6c,说明这些变量之间的地址分配还不是连续的,但是数组间的地址分配是连续的。
#include<stdio.h>
int main(){
    int a = 3;
    int b = 2;
    int array[3];//必须是常量
    array[0] = 1;
    array[1] = 10;
    array[2] = 100;
    int *p = &b;
    int i;
    for(i = 0;i < 6;i++){
        printf("*p = %d\n",*p);
        p++;
    }
    printf("------------------------\n");
    p = &b;
    for(i = 0;i<6;i++){
        printf("p[%d]=%d\n",i,p[i]);
    }
    return 0;
}```
- 指针运算
`p++`定义了p是int类型,所以大小是4字节,自增就是到下一个4字节的地址。
`p[1]`表示把p向下偏移4个字节
指针是变量,数组是指针常量,数组本身也是地址。
- 字符数组和指针字符串

include<stdio.h>

int main(){
char str[] = "hello";
char *str2 = "world";
char str3[10];
printf("input the value\n");
scanf("%s",str3);
printf("str is %s\n",str);
printf("str2 is %s\n",str2);
printf("str3 is %s\n",str3);
}```
str2在代码段,str2是指向这个地址而已,字符类型的指针,字符数组str3本身就是内存地址。str2指向字符串的指针,不能向里面scanf,str2是存的world字符串的地址,在代码段的地址,不能被修改,而str是字符数组的地址,str地址是在栈里面,字符数组是以\0为结尾。x/6cb 0x7ffffffde00打印6个字符,单字节显示。
栈和堆内存才能被写入。

  • 字符数组
    str[3]='\0'表示字符串结束位置,str2指向的是常量字符串,所以不能被修改
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容