C语言指针笔记

由于做算法题都用的C语言,就找时间补习了一下指针,看的书是《指针的艺术》,作者是蔡明志,把书中的经典题拿出来做个笔记,做个备份

++和*具有相同的运算优先级,但结合性是由右至左的。

    int i[] = {10,20,30,40,50};
    int *pa[] = {i, i+2, i+1, i+4, i+3};
    int **p2 = pa;//**p2为10
    p2++;//**p2为30
    ++*p2;//**p2为40
    **p2++;//**p2为20
    ++**p2;//**p2为21

第一句注释不解释了。
第二句p2++是将p2右移一位,移到i+2,即30
第三句++*p2根据结合性可看做++(*p2),*p2是指向i+2(30)的指针,将地址向下移一位便到了40(i中的地址是连续的)
第四句**p2++根据结合性可以看做**(p2++),由于++在后面,执行顺序又变成了(*(*p2)++),上面说过*p2指向i+2,右移一位是i+1,再取值为20
第五句++**p2根据结合性看做++(**p2),**p2为20,++后为21


    char *s[] = {"Stanford", "University", "California", "America"};
    char **sa[] = {s, s+1, s+2, s+3};
    char ***p3 = sa;
    printf("**p3++ = %s\n",**p3++);//Stanford
    printf("**++p3 = %s\n",**++p3);//California
    printf("**++*p3 = %c\n",**++*p3);//A
    printf("*(*--*++p3+3) = %c\n",*(*--*++p3+3));//i

可以看做是char s[4][10]
第一句**p3++++在后面,先执行**p3,就是Stanford,然后++,下移指向U
第二句**++p3,先++,下移指向C,**输出字符串California
第三句**++*p3,同第二句,也是将其下移,和第二句的区别是***是取元素的内容,**是指针,故第二句输入的是字符串,第三句输出的是字符
第四句*(*--*++p3+3)比较长,慢慢来分析,*++p3下移指向A,*--*++p3上移指向C,*--*++p3+3此时已经有两个*,故+3是向右移3个位置,是指向i的指针,*(*--*++p3+3)3个*则是取元素i


下面这个例子比较经典的展示了传值调用和传址调用的效果。。。

void swap_by_value(int a,int b) {
    int temp = a;
    a = b;
    b = temp;
}

void swap_by_address(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 100,y = 200;
    printf("before:x = %d,y = %d\n",x,y);//x = 100,y = 200;
    swap_by_value(x,y);
    printf("after:x = %d,y = %d\n",x,y);//x = 100,y = 200;
    
    x = 100; y = 200;
    printf("before:x = %d,y = %d\n",x,y);//x = 100,y = 200;
    swap_by_address(&x, &y);
    printf("after:x = %d,y = %d\n",x,y);//x = 200,y = 100;
}

下面这是一个改错题

//n为5
int *pf(int x[5],int n) {
    int m;
    int k[5];
    int j[] = {1,2,3};
    for (m = 0; m < 5;m++) {
        k[m] = j[m]+ x[m];
    }
    return k;
}

此题的主要问题在int k[5]这句话应该放在函数外面,局部变量会被销毁,变成野指针。。。


几个容易混淆的:
int (*p)[11]:p是指向含有11个元素数组的指针
int *p[1]:p是数组,含有11个元素,每一元素均为指向int型的指针
int **p;p是一个二重指针,需经两次的间接访问才能得到整数变量值
int(*p)(int):p是指向函数的指针,此函数含有int参数,返回值的数据类型为int
int *p(int):p是函数,此函数有一个int型参数,并返回一个指向int的指针


//计算字符串长度(strlen)
int stringLength(char *) {
    int t = 0;
    while(*p != '\0') {
        t++;
        p++;
    }
}
//复制字符串(strcpy),需注意传进来dest的内存够不够大
void myStringCopy(char *dest,char *source) {
    while((*dest = *source) != '\0') {
        source++;
        dest++;
    }
}
//拼接字符串(strcat),同样需要注意传进来的dest内存够不够大
void stringConcate(char *dest,char *source) {
    while(*dest != '\0') dest++;
    while((*dest = *source) != '\0') {
        source++;
        dest++;
    }
}
//拼接前n个字符到字符串(strncat),注意dest内存
void stringConcate_n(char *dest,char *source,int n) {
    int i = 1;
    while(*dest != '\0') dest++;
    while (i <= n && (*dest = source) != '\0') {
        source++;
        dest++;
        i++;
    }
}
//字符串比较(strcmp:0相等,1(正数)大于,-1(负数)小于)顺便在此说明以下,判断字符是否相等直接使用==即可,==表示判断地址是否一样,而不是内容,当然,地址一样内容一定一样,但内容一样地址不一定是一样的
int stringCompare(char *x,char *y) {
    for( ; *x == *y; x++,y++) {
        if (*x == '\0') return 0;
    }
    return *x - *y;
//比较字符串的前n位(strncmp)
int stringCompare_n(char *x,char *y, int n) {
    for (int i = 1; (*x == *y) || i <= n; x++,y++) {
        if (*x == '\0') return 0;
    }
    return *x - *y;
//关于结构体的指针(第一段)
struct student {
        char *name;
        int scrore;
    };
    
    struct student st = {"Brian",97};
    struct student *ptr = &st;
    
    printf("ptr->name = %s\n",ptr->name);//Brian
    printf("*ptr->name = %c\n",*ptr->name);//B
    printf("*ptr->name++ = %c\n",*ptr->name++);//B
    printf("*ptr->name = %c\n",*ptr->name);//r
    printf("*ptr->score = %d\n",ptr->scrore);//97
    printf("*ptr->score++ = %d\n",(ptr->scrore)++);//97
    printf("*ptr->sco = %d\n",ptr->scrore);//98
//关于结构体的指针(第二段)
struct student_new {
        char name[20];
        int scrore;
    };
    
    struct student_new st = {"Brian",97};
    struct student_new *ptr = &st;
    
    printf("*ptr->name = %c\n",++*(ptr->name));//C
    //在结构体中,如果是一般变量,则用.调用,若是指针变量,则用->调用,也可用*调用,如上例(*student).name

最后是链表,由于之前的算法题已经涉及过链表,我在这里就不说了,这本书上介绍的也就是创建及增删改查之类。

本书我只看了前8章,因为从第九章开始就讲的是C++/C#/JAVA之类的,所以笔记就到这里了。

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

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

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,444评论 3 44
  • 一、变量和内存空间 1. 语言中变量的实质 超市中的物品寄存箱,我们可以对寄存箱中进行存和取两个操作,为了避免存错...
    不高兴325阅读 522评论 0 0
  • 前言:指针是 C语言一个重要概念,也是C 语言的一个重要特色。使程序简洁、紧凑、高效。指针乃是C之精华。 数据在内...
    潇湘候晨雪阅读 764评论 0 0
  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,772评论 0 9
  • 前言 最近真的是忙的不可开交,公司一直给安排任务,连学习和写笔记的时间都没有了,落下好几次课的笔记都没有写,所以我...
    Xiho丶阅读 1,523评论 1 12