【C语言笔记】<十五>指针

指针的基本概念
#include <stdio.h>

// 基本数据类型作为函数的参数是值传递, 在函数中修改形参的值不会影响到外面实参的值
void change(int value) // int value = 10;
{
    value = 55;
    printf("哥被执行了\n");
}

// 数组作为函数的参数是地址传递, 如果是地址传递在函数中修改形参的值会影响到外面实参的值
void change2(int values[])
{
    values[1] = 88;
    printf("哥被执行了\n");
}


// 指针就是专门用于保存地址的
void change3(int *p) // 用什么接收地址?   指针 = 0ffc13  int *p = &num;
{
    *p = 55;
    printf("哥被执行了\n");
}

int main(int argc, const char * argv[]) {
    // 需求: 定义一个函数, 在函数中修改传入的实参的值
    /*
    int num = 10;
    printf("修改前:num = %i\n", num);
    change(num);
    printf("修改后:num = %i\n", num);
     */
    
    /*
    int nums[] = {1, 3};
    printf("修改前:nums[1] = %i\n", nums[1]);
    // nums == &nums == &nums[0]
    change2(nums);
    printf("修改前:nums[1] = %i\n", nums[1]);
    */
    

    int num = 10;
    // *p == num
    printf("修改前:num = %i\n", num);
    change3(&num);
    printf("修改后:num = %i\n", num);
    
    /*
     如何定义指针变量
     普通变量:
     数据类型 变量名称;
     
     指针变量:
     数据类型 * 变量名称;
     
     数据类型 : 说明将来指针变量能够保存什么类型的变量的地址
               注意: 指针变量是什么类型, 那么将来就只能保存什么类型变量的地址, 
               例如: 指针变量是int类型, 那么将来就只能保存int类型变量的地址
     * : 没有任何特殊含义, 仅仅是为了标示这是一个指针变量
     变量名称 : 用于区分不同的变量
     
     */
    /*
    int num; // 普通变量
    num = 10;
    
    int *p; // 指针 , 在64位编译器下占用8个字节
    // 千万注意: 指针变量只能存储地址
    p = &num; // 将num的地址存储到p这个指针中
    
    // p == &num
    printf("num = %p\n", &num);
    printf("p = %p\n", p);
    
    // 指针变量前的*号代表访问指针变量指向的那一块存储空间
    // *p == num
    *p = 55;
    printf("num = %i\n", *p);
    */
    
    return 0;
}
指针的注意点
#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 1.指针只能保存地址
    /*
    int *p = 200;
    printf("%i\n", *p);
     */
    
    /*************************华丽的分割线*******************************/
    
    // 2.同一个变量可以有多个指针指向它
    /*
    int num = 10;
    int *p = &num;
    // *p == num
//    num = 55;
    *p = 55;
    
    int *p1 = p;
    *p1 = 100;
    
    int *p2 = &num;
    
    printf("%i\n", *p);
     */
    
    /*************************华丽的分割线*******************************/
    
    // 3.指针的指向可以修改
    /*
    int a = 10;
    int b = 5;
    
    int *p = &a;
    *p = 88;
    
    p = &b;
    
    *p = 44;
    
    printf("%i\n", a);
    printf("%i\n", b);
    */
    
    /*************************华丽的分割线*******************************/
    
    // 4.不要访问野指针
    /*
    // 没有赋值的指针, 我们称之为野指针
//    int *p;
    int *p = NULL; // 0
    printf("%i\n", *p);
     */
    
    /*************************华丽的分割线*******************************/
    
    // 5.指针类型是什么类型, 就只能指向什么类型的数据
    /*
    int num = 10;
    char charValue = 'l';
    double doubleValue = 9.9;
    
//    int *p = &num;
//    int *p = &charValue;
//    int *p = &doubleValue;
    
    double *p = &doubleValue;
    printf("%lf\n", *p);
     */
    
    return 0;
}
多级指针
int main(int argc, const char * argv[]) {
    
    /*
    char charValue = 'l';
    // 1.拷贝需要指向的变量的数据类型和变量名称
    // 2.在数据类型和变量名称之间加上一颗星
    // 3.修改变量名称
    char *charValueP;
    charValueP = &charValue;
    
    // 1.拷贝需要指向的变量的数据类型和变量名称
    // 2.在数据类型和变量名称之间加上一颗星
    // 3.修改变量名称
    char **charValuePP; // 不管有几颗*只要是指针变量就占用8个字节
//    printf("size = %lu\n", sizeof(charValuePP));
    charValuePP = &charValueP;
    
//    charValue = 'j';
    // *charValueP == charValue
//    *charValueP = 'j';
    
    // &charValue == charValueP
    printf("&charValue = %p\n", &charValue);
    printf("charValueP = %p\n", charValueP);
    // &charValueP == charValuePP
    printf("&charValueP = %p\n", &charValueP);
    printf("charValuePP = %p\n", charValuePP);
    
    // *charValuePP == 0ffc14 ==  charValueP
    // *pp == p
    
    // **charValuePP == *(*charValuePP) == *charValueP == 0ffc14 == l
    **charValuePP = 'n';
    
    printf("%c\n", **charValuePP);
    */
    
    /*************************华丽的分割线*******************************/
    
    char c = 'a';
    char *cp;
    cp = &c;
    char **cpp;
    cpp = &cp;
    char ***cppp;
    cppp = &cpp;
    printf("cppp = %c\n", ***cppp);
    
    /*
     
     *cp == c;
     *cpp ==  cp;
     **cpp == *(*cpp) == *cp == c
     多级指针的操作, 最简单的方式, 就是通过几颗星来存储, 就通过几颗星来访问
     还有一种方式就是画图, 看图片中有几个箭头, 有几个简单就用几颗星来访问
     */
    printf("c = %c\n", c);
    printf("*cp = %c\n", *cp);
    printf("&c = %p\n", &c);
    printf("cp = %p\n", cp);
    printf("*cpp = %p\n", *cpp);
    printf("**cpp = %c\n", **cpp);
    
    return 0;
}
指针为什么分类型
int main(int argc, const char * argv[]) {
    /*
    char *cp;
    int *ip;
    double *dp;
    double **dpp;
    // mac系统中的指针无论是什么类型, 几级真正都占用8个字节
    // 由于Mac是64位了,  32  = 4 * 8;  64 = 8 * 8;
    printf("cp = %lu, ip = %lu, dp = %lu, dpp = %lu\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(dpp));
     */
    // 指针为什么要分类型?
    // 因为当我们利用指针去取值的时候, 系统就会自动根据指针的类型来确定应该取对少个字节中的值
    int  intValue = 1230; //
    char charValue = '1';
    /*
     00110001
     11001110
     00000100
     00000000
     
     00000000 00000100 11001110 00110001
     */
    /*
    int *charValueP;
    charValueP = &charValue;
    
    printf("%i\n", *charValueP);
    printf("%i\n", 0b00000000000001001100111000110001);
     */
    
    /*
     11001110
     */
    char *p = &intValue;
    printf("%i\n", *p);
    
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,422评论 3 44
  • C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...
    小辰带你看世界阅读 932评论 0 6
  • 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一个字节都有一个内存...
    C语言学习阅读 1,278评论 0 4
  • 短信所发送的字节有限,一般为140字节左右,若对短信进行签名,会导致短信利用率降低,故短信签名的过程中,签名的长度...
    守拙圆阅读 1,652评论 0 1
  • 最近课程中探讨的是一个非常特殊的话题,关于“性”,可能有的小伙伴无法写读书笔记,而作为曾经的医务工作者,我感觉一切...
    月小姐的花园阅读 664评论 0 2