C语言基础(二)指针

C语言存储类

1:suto,register,static ,extern

int *a;//正规写法
int* a;
int * a;
int* a,b;//其他写法看起来有歧义
//使用
int i=10;//声明一个整型变量
int *p=&i;//&取地址,*声明一个指针
printf(&i);//i的地址
printf(&p);//*p地址

在32位操作系统中,指针占4个字节,在64位操作系统中,指针占8个字节

printf(sizeof(p))==4;//32位操作系统
printf(sizeof(p))==8;//64位操作系统

解引用-解析地址并放回内存地址中保存的值

    //声明一个整型变量
    int i = 10;
    //将i的地址使用取地址符给p指针
    int *p = &i;
    //输出 0xffff 16进制地址
    printf("地址赋值前i=%d\n", i);//10
    printf("地址赋值前p=%d\n", p);//地址
    printf("地址赋值前*p=%d\n", *p);//&i的值
    //修改地址的值,则i值也变成100
    //为解引用的结果赋值也就是为指针所指的内存赋值
    *p=100;
    printf("地址赋值后i=%d\n", i);//100
    printf("地址赋值后p=%d\n", p);//地址
    printf("地址赋值后*p%d\n", *p);//100

2:作用域和生命周期是两码事

3:C语言头文件 include<>include""两种方式 ,“”引号一般是自己写的头文件。<>一般是系统的头文件

4:指针 可以理解为数据类型类似于 int chart float....

指针是一种特殊变量(指针变量),它保存另一个变量的内存地址,32位操作系统占4个字节,64位操作系统占8个字节

概念:操作系统内存是8G,系统为了更好的管理我们的内存,就为内存区的每一个字节都分配一个唯一的编号,这就是地址,指针的实质,就是地址,就是这一个个比那好

5:悬空指针 和野指针 危险

一个指针所指向的内存被释放后,这个指针就被悬空了,访问悬空指针会导致程序不正常,崩溃等问题,如果影响到其他功能,问题很难定位,我们释放内存时,把指向这块内存的指针变量设置为NULL,访问指针变量前判断是否为NULL。

进阶:当有多个指针变量都指向同一块内存时,释放这块内存时,需要将所有指针变量的值都置为NULL,这需要维护所有指向这块内存的指针变量的信息,但是这种方式开销大,所以通常很少使用。使用频率不是非常高的对象,可以在使用前先根据id等索引查找,如果找不到,则不要使用。如果有使用者时,不能释放这块内存,我们可以使用引用计数,只有当引用计数为0时,才真正释放内存,否则,只是引用计数减1。

指向的地址是不确定的指针,为野指针
(1):指针定义后没有初始化,其值是不确定的
(2):被free后没有赋值NULL,后续又继续使用了该指针
(3):指针的操作,超过了变量的作用范围(不是指针越界)
(4):函数返回指向栈内存的指针(栈内存函数运行结束后会被释放)

6:运算符

&运算符 用于取一个对象的地址

*间接寻址符 用于访问指针所指向的地址的值

int *prt 定义一个指针

int b=*prt,b是指针所指向地址的值

&与*是互逆运算

7:通用指针

//通用指针
int n;
char c;
short s;
//指针类型 分别是 int  chart short  
int *ptr_n = &n;
chart *ptr_c = &c;
short *ptr_s =&s;
void* ptr_void =ptr_n;//整型指针转通用指针,地址不会改变,但是类型会丢失

8:指针的算术运算

(1):对于变量,不同的类型,占用的空间大小不一样
(2):对于不同类型的指针变量,他们占用的空间都是相同的

//指针运算
    int  arr[]={11,22,33,44,55};
    int *p_arr=arr;
    size_t j=0;
    for ( j=0;j<5;j++){
    //自增++ 运算符比 解引用* 高,但++在后为先用后加
    //如果++在前则输出 22 33 44 55
        printf("%d\n",*p_arr++);//11 22 33 44 55
    }
//指针指向地址,指针运算实际上就是移动指针指向的地址位置,移动的位数取决于指针类型(int就
//是32位)*p_arr+1移动四个字节向下一个内存快(由11移动到22)


32位操作系统.png

指针是指向一个内存空间的变量

    int  arr[]={11,22,33,44,55};
    //直接打印数组arr,arr地址指向数组首个元素
    printf("arr=%p\n",arr);//arr=000000000061FD80
    printf("*arr=%d\n",*arr);
    int *pInt=arr;//把arr数组赋值给pInt指针,指针的地址也是数组首元素地址
    printf("数组首元素地址=%p",&*pInt);//000000000061FD80

9:指针和二维数组

//一维数组,一维数组的值不能修改,二维数组的值可以修改,标注:?????????
int array[5]={0};//int *ptr_a
//二维数组,
int array[][3]={
{1,2,3},
{4,2,3},
{1,5,3},
{6,2,3}
}
int (*ptr_a)[3]=arr;
//遍历 数组
//

10:指针的指针

//为什么需要二级指针

11:函数指针

12:总结

//理解一下概念,表示学会了指针
int *p;
int *p[n];
int (*p)[n];
int *p();
int (*p)();
int  **p;
//指针最重要的,用指针的时候,脑子一定要明白指针指向哪里!

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

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,446评论 3 44
  • 第十章 指针 1. 地址指针的基本概念: 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为...
    坚持到底v2阅读 1,072评论 2 3
  • 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一个字节都有一个内存...
    C语言学习阅读 1,283评论 0 4
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,315评论 0 6
  • 转自CSDN博客 原文链接:http://blog.csdn.net/xinyuwuxian/article/de...
    傻彬儿阅读 739评论 0 0