黑马程序员技术交流社区
标题:
帮助大家彻底解决指针问题!发帖用了一下午,希望可以.....
[打印本页]
作者:
JuniorACMer
时间:
2015-3-7 18:14
标题:
帮助大家彻底解决指针问题!发帖用了一下午,希望可以.....
第一部分 指针的用法(看完保证你不会再用错)
由于指针确实比较难以理解,所以本人分两部分来写了!活了一下午时间,希望对大家有所帮助,当然了亲爱的版主要是可以多给几个技术分的话,一个帖子我就说完了,也省的从新开贴!(指针的理解,我会用图片详细说一下,不过得花些时间)
自己手写的几个代码,帮助大家正确认识指针的用法。程序本身没有什么意义,本来我想用约瑟夫问题来讲解的,怕代码搞得太长,小伙伴们不想看!
大神绕道,纯属分享,我是小菜鸟一只,不喜勿喷!
我们在写程序的时候经常被指针搞来搞去,那么好了,现在我来详细说明指针怎么用,还有指针怎么理解,当然,本着实事求是的目的,先来讲一下指针怎么用!
小伙伴们学习数据结构的时候,肯定遇见过这样的问题,为什么我写的链表没有像预想中的那样输出,或者赋值,更郁闷的是编译调试竟然没有出错,可一旦运行,提示程序出现了一个问题,然后自己开始找毛病,跟正确的代码对比,原来自己少写了一个*,然后高高兴兴的加上去。玩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汇编,估计就没人看了。拜托了各位!
祝愿各位都可以来到黑马,大家一起学习加油!
作者:
JuniorACMer
时间:
2015-3-7 18:19
版主看着给几个技术分吧,后面实在无力啊,毕设还没搞完,又真心想来黑马,一个一个敲上去的啊,祝愿版主羊年事业有成,祝愿给位心想事成,将来能够在一个班级学习,好累,得去吃东西了!提前跟各位晚安了!
作者:
JuniorACMer
时间:
2015-3-8 08:45
没人回复,没动力了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2