C语言指针数组和指向指针的指针
来源:互联网 发布:js点击列表进详情页 编辑:程序博客网 时间:2024/04/29 14:42
请先看下面的代码:#include <stdio.h>#include <stdlib.h>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 <stdio.h>#include <stdlib.h>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。
0 0
- C语言指针数组和指向指针的指针
- c语言学习,指针函数、函数指针、指针的指针、指向指针数组的指针
- c语言学习,指针函数、函数指针、指针的指针、指向指针数组的指针
- 黑马程序员--C语言--01-指针数组、指向数组的指针、指向指针的指针
- 黑马程序员04--C语言--01-指针数组、指向数组的指针、指向指针的指针
- C语言中的指针(指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针)
- c语言指针,指向指针的指针
- C语言学习笔记之指向数组元素的指针和指向数组的指针
- 指针数组,和指向指针的指针
- 指针数组和指向指针的指针
- 指针数组和指向指针的指针
- 数组指针和指向指针的指针
- C语言学习-----指针篇(1)-----指向多维数组的指针和指针变量
- C语言特性(指针数组和指向指针变量的指针)
- C语言数组指针(指向数组的指针)
- C语言数组指针(指向数组的指针)
- C语言数组指针(指向数组的指针)
- 93 C语言数组指针(指向数组的指针)
- 《Android开发环境》 第二章 Android Studio安装与环境搭建
- Dynamic Linking
- 好记性不如烂笔头73-多线程-继承thread实现简单多线程
- 自圆其说的“CPU”的理解
- Can't bind to local 8700 for debugger报错和解决
- C语言指针数组和指向指针的指针
- lastPathComponent的功能
- FreeMarker学习(一)
- 使用HMAILSERVER搭建邮件服务器
- Web Services学习笔记01
- 构建黄金组合LVS + Keepalived高可用负载均衡集群&填坑++
- PageRank算法简介及Map-Reduce实现
- python将字符串转成16进制的ASCii码的值
- 【Android基础篇】使用ExpandableListView实现自定义的下拉列表