C语言知识汇总 | 52-C语言数组灵活多变的访问形式

__C 专栏收录该内容
106 篇文章 5 订阅

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

#include <stdio.h>
   
int main()
{   
	char str[20] = "blog.csdn.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 = blog.csdn.net
 s2 = og.csdn.net
 c1 = .
 c2 = b
 c3 = .
 c4 = d
 c5 = s
num1 = 100
num2 = 140726291760272
num3 = 140726291760274

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


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


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


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


(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

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

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

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值