大一C语言关于指针的作业,一道题目,玩转C语言指针数组和指向指针的指针

请先看下面的代码:

#include

#include

int main(){

char *lines[5] = {

"COSC1283/1284",

"Programming",

"Techniques",

"is",

"great fun"

};

char *str1 = lines[1];

char *str2 = *(lines + 3);

char c1 = *(*(lines + 4) + 6);

char c2 = (*lines + 5)[5];

char c3 = *lines[0] + 2;

printf("str1 = %s\n", str1);

printf("str2 = %s\n", str2);

printf(" c1 = %c\n", c1);

printf(" c2 = %c\n", c2);

printf(" c3 = %c\n", c3);

return EXIT_SUCCESS;

}

运行结果:

str1 = Programming

str2 = is

c1 = f

c2 = 2

c3 = E

看下面的分析之前,请先了解指针数组和指向指针的指针的基本概念,如果你不了解,先看下面的文章:

#include

#include

int main(){

char *string0 = "COSC1283/1284";

char *string1 = "Programming";

char *string2 = "Techniques";

char *string3 = "is";

char *string4 = "great fun";

char *lines[5];

lines[0] = string0;

lines[1] = string1;

lines[2] = string2;

lines[3] = string3;

lines[4] = string4;

char *str1 = lines[1];

char *str2 = *(lines + 3);

char c1 = *(*(lines + 4) + 6);

char c2 = (*lines + 5)[5];

char c3 = *lines[0] + 2;

printf("str1 = %s\n", str1);

printf("str2 = %s\n", str2);

printf(" c1 = %c\n", c1);

printf(" c2 = %c\n", c2);

printf(" c3 = %c\n", c3);

return EXIT_SUCCESS;

}

这样,或许会清晰很多,char *lines[5]; 定义了一个指针数组,数组的每一个元素都是指向char类型的指针。最后5行,为数组的每一个元素赋值,都是直接赋给指针。

而lines,是一个指向指针的指针,它的类型为 char **,所以 *lines 是一个指向字符的指针,**lines是一个具体的字符。这一点很重要,一定要明白。

指针是可以进行运算的,lines 为lines[5]数组的首地址,即第0个元素的地址;lines+0, lines+1, lines+2 ... 分别是第0, 1, 2 ...个元素的首地址,*(lines+0)或lines[0], *(lines+1)或lines[1], *(lines+2)或lines[2] ... 分别是字符串 str0, str1, str2 ... 的首地址。所以:

*lines == *(lines+0) == lines[0] == str0

*(lines+1) == lines[1] == str1

*(lines+2) == lines[2] == str2

...

注意:lines为指向指针的指针,所以*(lines+n)为指针,**(lines+n)才为具体的字符。

上面的题目中:

lines[1]:它是一个指针,指向字符串string1,即string1的首地址。

*(lines + 3):lines + 3 为lines[5]数组第3个元素的地址,*(lines + 3)为第3个元素,它是一个指针,指向字符串string3。

*(*(lines + 4) + 6):*(lines + 4) + 6 == lines[4] + 6 == string4 + 6,为字符串string4第6个字符的地址,即 f 的地址,*(*(lines + 4) + 6) 就表示字符 f。

(*lines + 5)[5]:*lines + 5 为字符串 string0 第5个字符的地址,即 2 的地址,(*lines + 5)[5]等价于*(*lines + 5 + 5),表示第10个字符,即2。

*lines[0] + 2:*lines[0] 为字符串string0 第0个字符的地址,即C的地址。字符与整数运算,首先转换为该字符对应的ASCII码值,然后再运算,所以 *lines[0] + 2 = 67 + 2 = 69。不过要求输出字符,所以还要转换成69所对应的字符,即E。

如果你觉得上面的代码难以理解,可以先看 C语言数组灵活多变的访问形式,容易很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值