指针数组以及指向字符串的理解

原创 2012年03月28日 21:48:09
在看《C程序设计语言》第五章中,有一节指针数组,看了还是很迷糊的,于是在电脑上写了一些代码,得到了一些体验,便记录下来,倘若有说的不对的地方,请多多指教。

我的C测试代码如下:

#include <stdio.h>

int main(void)
{
	char * str="liuwei";
    char *month_name[] = 
    {
        "January","February","March",
        "April","May","June",
        "July","August","Septemter",
        "October","November","December"
    };
    int i = 0;
    while(i<12)
    {
        printf("%s\n",month_name[i]);
        i++;
    }
	printf("%s\n",++(*month_name));
	printf("%c\n",(++(*month_name))[3]);
    printf("%c\n",*++month_name[1]);
    
    return 0;
}
下面的语句,想必有点C语言基础的都能理解,就是分别打印出所有指针指向的字符串
while(i<12)
{
    printf("%s\n",month_name[i]);
    i++;
}

结果就是:
January
February
March
April
May
June
July
August
Septemter
October
November
December
这个倒是挺容易的。

好的,那么printf("%s\n",++(*month_name));这个语句有事什么意思呢?

看我慢慢道来:


1、首先month_name这个是数组名,它指向首元素的地址,&month_name是整个数组的首地址,两者的值是一样的,当然,两者是有区别的,详细的区别参见《C语言深度解剖》86页,
好了,*month_name就是指向"January"这个字符串,
若用printf("%s\n",(*month_name));这个语句
则会打印出
January
也可以把*month_name理解成month_name[0];
++(*month_name)这个的意思就是指针加1,指向了字符a以及其余后面字符所构成的字符串anuary,
那么printf("%s\n",++(*month_name));
就会打印出anuary,
若是printf("%s\n",++(*month_name));
则打印的是January,然后指针再加1
应该理解了吧~哈哈!(废话,都以为像你一样啊,赶紧的!~~)

2、对于printf("%c\n",(++(*month_name))[3]);这个语句,大家看一看到有%c,应该可以猜到是输出一个字符了,没错,那倒底是输出哪一个呢?
上面已经说了*month_name以及++(*month_name)的意义,
那么再首先来看看(++(*month_name))[0]的意思吧。在这个语句中,指针又加了1,又指向了后面的字符串"nuary",加后面的[0]引用,则确定到了某一个字符,即'n'.(也可以理解为month_name[0][0],当然,此时的month_name[0]已经是"nuary"了!)。
所以printf("%c\n",(++(*month_name))[3]);就是输出字符'r'了。

3、对于printf("%c\n",*++month_name[1]);咋一看我还真不理解,不过只要功夫深,哦,是“只要锄头挥的好,哪有墙脚挖不倒?” 诶哟,扯远了!~赶紧回来!首先[]的优先级(结合律)比++来的高,所以*++month_name[1]就等同于*++(month_name[1]),又因为++的优先级比*(指针引用)来的高,所以又等同于*(++(month_name[1])),问题似乎明朗起来了,
month_name[1]就是指向"February"字符串,++month_name[1]就是指向"ebruary"字符串,在*(++(month_name[1]))当中,指针是先加的1,然后在取值(引用),所以输出的就是字符'e'了,(也可以理解为month_name[1][0],当然,此时的month_name[1]已经是"ebruary"了!不知这样理解妥不妥当~但是心里一定要理解啊!)

关于递归调用,函数指针,数组,字符串的一些理解

先放自己写得一段代码和问题,下面给出自己想出来的解答,有不对的地方请指正,谢谢。...

理解C语言——从小菜到大神的晋级之路(8)——数组、指针和字符串

本期视频点击这里        在前面几次我们接触的数据类型都是简单数据类型,使用一个数据个体表示一个元素。C语言中还提供了多种复杂数据类型,其中最简单的一种就是数组。数组这一结构使用内存中一段连续的...

你真的理解指针、数组和字符串吗?

指针、数组、字符串是C/C++语言中重要的组成部分,很多人认为指针比较难理解,而初学者更容易在这里犯错误,其实当你真正理解其本质后,也就不难了。 首先来看一些错误用法的示范:...
  • hmalloc
  • hmalloc
  • 2014年02月20日 15:59
  • 842

实验5 数组、指针与字符串

  • 2011年12月25日 15:46
  • 27KB
  • 下载

指针指向字符串常量和数组存放字符串常量(char *p="abcd", char p[]="abcd")

指针指向字符串常量和数组存放字符串常量(char *p=”abcd”, char p[]=”abcd”)代码结果分析 fun()函数 首先abacd字符串是在静态常量区分配的内存,然后指针c在栈里分...
  • yeruo
  • yeruo
  • 2016年06月19日 11:12
  • 771

用指针数组的方法将字符串排序

  • 2008年12月23日 15:14
  • 607B
  • 下载

C++课程-3_数组指针与字符串

  • 2011年08月25日 18:49
  • 315KB
  • 下载

字符、字符数组(字符串)与指向字符串的指针

今天在写一个简单的面向连接的TCP Socket程序时(UNIX Network Programming上的时间服务器和客户端例子)。有个简单的改变是将从服务器返回的日期字符串 改成一个字符一个字符的...

数组指针与字符串

  • 2015年11月25日 19:35
  • 468KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针数组以及指向字符串的理解
举报原因:
原因补充:

(最多只允许输入30个字)