详解C语言数组灵活多变的访问形式

 更新时间:2021年01月21日 10:34:35   作者:zy_kxo  
这篇文章主要介绍了详解C语言数组灵活多变的访问形式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

C语言中的指针使得代码的编写非常灵活,如果指针能够和数组结合,那将会有更多的“花招”,请看下面的代码:

#include <stdio.h>  
int main(){  
 char str[20] = "c.biancheng.net"; 
 char *s1 = str; 
 char *s2 = str+2;
 char c1 = str[4];
 char c2 = *str;
 char c3 = *(str+4);
 char c4 = *str+2;
 char c5 = (str+1)[5];
 
 int num1 = *str+2;
 long num2 = (long)str;
 long num3 = (long)(str+2);
 
 printf(" s1 = %s\n", s1);
 printf(" s2 = %s\n", s2);
 printf(" c1 = %c\n", c1);
 printf(" c2 = %c\n", c2); 
 printf(" c3 = %c\n", c3); 
 printf(" c4 = %c\n", c4);
 printf(" c5 = %c\n", c5);  
 printf("num1 = %d\n", num1);  
 printf("num2 = %ld\n", num2);
 printf("num3 = %ld\n", num3);
 return 0;
}

运行结果:

 s1 = c.biancheng.net
 s2 = biancheng.net
 c1 = a
 c2 = c
 c3 = a
 c4 = e
 c5 = c
num1 = 101
num2 = 6421984
num3 = 6421986

怎么样,够晕吧,如果你嗤之以鼻,那么恭喜你,你的C语言基础很扎实。

1) str 既是数组名称,也是一个指向字符串的指针;指针可以参加运算,加 1 相当于数组下标加 1。
printf() 输出字符串时,要求给出一个起始地址,并从这个地址开始输出,直到遇见字符串结束标志\0。s1 为字符串 str 第 0 个字符的地址,s2 为第 2 个字符的地址,所以 printf() 的结果分别为 c.biancheng.net 和 biancheng.net。

2) 指针可以参加运算,str+4 表示第 4 个字符的地址,c3 = *(str+4) 表示第4个字符,即 'a'。

3) 其实,数组元素的访问形式可以看做 address[offset],address 为起始地址,offset 为偏移量:c1 = str[4]表示以地址 str 为起点,向后偏移4个字符,为 'a';c5 = (str+1)[5]表示以地址 str+1 为起点,向后偏移5个字符,等价于str[6],为 'c'。

4) 字符与整数运算时,先转换为整数(字符对应的ASCII码)。num1 与 c4 右边的表达式相同,对于 num1,*str+2 == 'c'+2 == 99+2 == 101,即 num1 的值为 101,对于 c4,101 对应的字符为 ‘e',所以 c4 的输出值为 'e'。

5) num2 和 num3 分别为字符串 str 的首地址和第 2 个元素的地址。

为了加深大家的理解,请继续阅读下面的代码:

#include <stdio.h>
#include <stdlib.h> 
int main(){
 char str[20] = {0};
 int i;
 for(i=0; i<10; i++){
 *(str+i) = 97+i; // 97为字符a的ASCII码值
 }
 
 printf("%s\n", str);
 printf("%s\n", str+2);
 printf("%c\n", str[2]);
 printf("%c\n", (str+2)[2]);
 return 0;
 
}

运行结果:

abcdefghij
cdefghij
c
e

第5行代码用来将字符数组中的所有元素都初始化为\0,这样在循环结束时就无需添加字符串结束标志。

前面三个 printf() 比较容易理解,第四个 printf() 可以参照上面的说明 3),str+2 表示指向第 2 个元素,(str+2)[2] 相当于 *(str+2+2),也就是取得第 4 个元素的值。

到此这篇关于详解C语言数组灵活多变的访问形式的文章就介绍到这了,更多相关C语言数组访问形式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++基于boost asio实现sync tcp server通信流程详解

    C++基于boost asio实现sync tcp server通信流程详解

    这篇文章主要介绍了C++基于boost asio实现sync tcp server通信的流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++回溯算法中子集问题分析探讨

    C++回溯算法中子集问题分析探讨

    回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为回溯点
    2023-03-03
  • C语言中数组排序浅析

    C语言中数组排序浅析

    这篇文章主要为大家介绍了C语言算法练习中数组元素排序的四种类型,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-12-12
  • C++中getline()的用法详解

    C++中getline()的用法详解

    这篇文章主要介绍了C++中getline()的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 详谈C++ socket网络编程实例(2)

    详谈C++ socket网络编程实例(2)

    这篇文章主要为大家介绍了C++ socket网络编程实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 解析在main函数之前调用函数以及对设计的作用详解

    解析在main函数之前调用函数以及对设计的作用详解

    本篇文章是对在main函数之前调用函数以及对设计的作用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C/C++线程退出的四种方法小结

    C/C++线程退出的四种方法小结

    本文主要介绍了C/C++线程退出的四种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C语言高斯消元法的使用详解

    C语言高斯消元法的使用详解

    本篇文章是对C语言中高斯消元法的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c++的构造函数使用方式

    c++的构造函数使用方式

    这篇文章主要介绍了c++的构造函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • C语言简单实现计算字符个数的方法

    C语言简单实现计算字符个数的方法

    这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论