C语言之 数组 指针 结构体


                最近看了c语言和数据结构,终于把c语言里面的数组,指针和结构体弄明白了。当然由于我以前基础比较薄弱,这个过程很痛苦,看了很多书也看了一些视频,在讲之前我先说一下我看的书吧,可以为初学者提供一些帮助,谭浩强《c程序设计》《c和指针》《大话数据结构》 清华严蔚敏的《数据结构》 以及西交大的张一凡写的清华严蔚敏《数据结构》的算法实现一书。
      可能大家看到我罗列了很多数据结构的书,我个人体会是学习完c语言后把链表,栈及队列这些用c实现可以说对c的指针数组及结构体有很大的帮助。我本科以前是看谭浩强的c语言,当时没有看其它的书,现在把上面的书都看了个遍,谭浩强老师的书写得很是中规中矩,但初学者很适合看这个应为我感觉他的思维是我们中国的思维,里面没有太多的涉及到很深的原理性的东西,他把c语言讲得很是直白,但是对于应用c我们除了要了解c的定义等等是不行的,还需要学会一些技巧,以及很深入的原理性的东西比如说指针,可以说指针是c的精华,它不光简洁而且执行效率很高,所以如果c语言已经入门可以把《c和指针》这本书看看,这里面讲了很多关于指针实用的技巧及方法,最后把c应用到数据结构这个过程会把你的c基础实现一个很大的提升。
      下面先说指针,我刚开始学的时候看了谭老师的书很是迷惑,特别是他书中的一个例子后面的解析直接让我看晕了书中说这两个*pointer_1和*poiner_2不一样,说的是前一个是定义了一个指针变量,后面一个是指针变量指向的变量,其实这儿就是一个指针变量初始化化和引用的例子。我们先来看指针的定义,int *pointer_1这个应该先看int *这个东东,int*应该读成指向int型的指针变量,就好比我们后面会学一个 int *a[],还有这个int (*)a[],int *p()和int (*)p(),上面就是常说的指针数组和数组指针,指针函数和函数指针,我觉得上面的叫法很不容易记住,我也没打算记住它,理解了就十分的清晰了。回到我们刚刚说的定义和引用,由于指针变量是一个存放地址的变量(这个变量不是*pointer_1,而是pointer_1千万要记住*只是一个指针解引用符,因为指针是间接访问得到在某个地址上存放的数据的,我们便用一个变量存放这些地址,所以在指针定义后我们要给它一个地址,不然指针变量的指向不确定是十分危险的,然后我们把这个存放地址的变量设置成int *这个类型)这样我们每次看到int*定义的东西我们就知道pointer这个变量是一个指针变量它存放了一个地址,我们通过对* pointer进行解引用然后就可以获取这个地址上存放的数据,所以本段开始我讲了两个都是一样的,一个是定义了一个指针变量(这个变量是一个指向int *型的指针变量),后一个是对指针变量的解引用取地址上的那个值。

      上面讲了指针的定义和引用,明白了上面讲的从定义上我们都可以推出int*a[],对于int*a[]应该和指针的指针联系在一起即**p。因为对于int *a[]来说我前面已经说了我们应该把它看成int *类型的数组就是和int a[]一样它也存放数据但是这个数据不是后面像int a[]里面存放的是整型数据而是存放的整型的地址,就是对于int *a[]我们通过数组下标能够找到里面的数据元素也即是前面我说的地址也即是指针,然后通过找到的这个地址然后再找到这个地址存放的数据元素。所以它和前面我说的int **a是一个意思,为什么这样说呢?因为int **a是一个指向指针的指针也就是指向地址的地址,我们可以用谭浩强老师书上的例子来说明:

int main()

 {
   char *a[]={"hello","ok","fine"};
   char **p,i;
   p=a;
   for(i=0;i<3;i++)
   {
    printf("%s\n",*p);
    p++;
   }
 } 
       在这个例子里面我们把指针数组的首地址a给了指针变量p,然后用指针解引用符*,用*p指向每个字符串的首地址然后用printf("%s\n",*p)就可以将字符串打印出来了。当然如果指针数组*a[]里面放的不是字符串,而是数据那么我们打印时就应该用**p将数据打印出来。因为*p相当于一个地址然后再用指针解引用符*解引用*p所指向的地址那么就得到了输出数据。对于指针及指针数组和指针的指针就到此,后面会将多维数组,及将结合数据结构再讲结构体及结构体指针,以及结构体的指针的指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值