| 
 
| 第一部分      指针的用法(看完保证你不会再用错) 由于指针确实比较难以理解,所以本人分两部分来写了!活了一下午时间,希望对大家有所帮助,当然了亲爱的版主要是可以多给几个技术分的话,一个帖子我就说完了,也省的从新开贴!(指针的理解,我会用图片详细说一下,不过得花些时间)
 自己手写的几个代码,帮助大家正确认识指针的用法。程序本身没有什么意义,本来我想用约瑟夫问题来讲解的,怕代码搞得太长,小伙伴们不想看!
 大神绕道,纯属分享,我是小菜鸟一只,不喜勿喷!
 我们在写程序的时候经常被指针搞来搞去,那么好了,现在我来详细说明指针怎么用,还有指针怎么理解,当然,本着实事求是的目的,先来讲一下指针怎么用!
 小伙伴们学习数据结构的时候,肯定遇见过这样的问题,为什么我写的链表没有像预想中的那样输出,或者赋值,更郁闷的是编译调试竟然没有出错,可一旦运行,提示程序出现了一个问题,然后自己开始找毛病,跟正确的代码对比,原来自己少写了一个*,然后高高兴兴的加上去。玩LOL去了……
 可是,为什么会这样呢?你没去想过,下一次你写的时候,又出现这样的问题了,然后,你信誓旦旦的说,老子以后尽量不用指针。可是遗憾的是,有些程序问题必须用指针解决!
 那么首先来看如下一个示例:
 #include<stdio.h>
 #include<stdlib.h>
 typedef struct NODE                   //声明一个结构体变量
 {
 int data;
 char ch;
 }node;
 int createNode(node *q);
 int main()
 {
 node *p=NULL;
 createNode(p);
 printf("%d\n",p->data);
 printf("%c\n",p->ch);
 return 0;
 }
 int createNode(node *q)              //创建一个节点并进行初始化
 {
 q=(node *)malloc(sizeof(node));
 if(NULL==q)
 {
 printf("内存分配失败!\n");
 return 0;
 }
 (q)->ch='H';
 (q)->data=100;
 return 1;
 }
 这是我曾经遇到的,百思不得其解,当然聪明如你,小伙伴一下子就看出来了哪里出了问题,以及该怎么解决了!那么请你不要往下面看了,我说了,这是给那些刚接触C语言,刚接触数据结构的小伙伴们看的,你要是明白了,就赶紧省些时间去写OC实例吧!
 那些没看出来的小伙伴,不要紧,下面是我改正过后的代码:
 #include<stdio.h>
 #include<stdlib.h>
 typedef struct NODE                   //声明一个结构体变量
 {
 int data;
 char ch;
 }node;
 int createNode(node **q);               //注意这里为**
 int main()
 {
 node *p=NULL;
 createNode(&p);                   //注意这里为&p
 printf("%d\n",p->data);
 printf("%c\n",p->ch);
 return 0;
 }
 int createNode(node **q)              //创建一个节点并进行初始化
 {
 *q=(node *)malloc(sizeof(node));    //注意这里为*q
 if(NULL==q)
 {
 printf("内存分配失败!\n");
 return 0;
 }
 (*q)->ch='H';
 (*q)->data=100;
 return 1;
 }
 对比一下,我相信你看出来区别了,为什么呢?因为一句话,第一个代码没有分配p的内存空间,更别说给p附初值什么的了!可是这又是为什么呢?这个得等我下部分说了。卖个关子,相信你不会等的太久!接下来我讲下我是怎么正确使用指针的!
 注:以下内容参考一位百度知道上面的大神写的,不过后来我找不到了!要不就可以给大家连接了。
 下面的理解不一定真确,但是,这样做可以明白指针如何使用不会出错!!!
 首先,我们要搞清楚几个概念,举例来说
 int *p=NULL;
 这句代码,指针的类型是:int *(指向一个int类型的数据地址),指针指向的类型是:int(这是一个整形数据)
 int**p=NULL;
 这句代码,指针的类型是:int**(这是一个指针的地址),指针指向的类型是:int*(这是一个整形变量的地址),而这个指针存储的数据类型是:int
 好了,这时,我们需要记得,使用指针的时候,类型必须相同,才可以引用,否则一定出错,(不出错的话就拜托老天不会出现什么重大bug了,否则会很严重。呵呵……)。
 如上面我举得例子,不要害怕使用**类型,这个调用函数是:int createNode(node **q);
 而p的类型是node *,想要在主函数电泳这个函数,该怎么传递形参呢?我们都知道一个&等价于一个*,所以嘛,嘿嘿createNode(&p);这样不就行了,这是传递的形参是int*&类型,相当于int**,所以调用成功。
 下部分我会说明,int a[][],int **p,int *p[],int *(&p),指针数组a[5],a,&a,*(&a),函数指针,指针函数,结构体指针,等等之间的恩怨情仇。
 
 如果大家喜欢的话,拜托顶下帖子,毕竟都是纯干货分享,都是自己这些年的老本了,混个技术分真不容易!说完这两部分以后,再来发帖,估计就是浅谈IOS编程中的逆向工程了,那时候说说AT&T汇编,估计就没人看了。拜托了各位!
 祝愿各位都可以来到黑马,大家一起学习加油!
 
 | 
 |