数组指针

本文详细介绍了C语言中的数组、指针的概念及其应用。通过实例展示了如何以指针方式遍历数组,以及字符数组与字符串常量之间的区别。同时,探讨了两种不同的指针遍历字符串的方法,强调了数组名与首地址的关系以及字符串在内存中的存储方式。
摘要由CSDN通过智能技术生成

1、数组指针

        ● 数组是一系列具有相同类型的数据的集合,数组中的所有元素都是连续排列的;

           整个数组都是占用的一块儿内存;

           数组名可以认为是一个指针,它指向数组中的第 0 个元素;

           C 语言中我们将第 0 个元素的地址称为数组的首地址,注意数组名和数组首地址并不总是等价的;

2、以指针的方式遍历数组

        ● sizeof(arr):取得数组总字节数长度;

           sizeof(int):取得 int 类型数据占用的字节数,数组总字节数长度 / 每个元素占用字节数 = 数组长度;

        ● 由于数组名可以看作是数组首地址,所以 arr+i,就是每个元素的指针,用 * 取值,得到每个元素的值;

#include <stdio.h>

using namespace std;

int main() {
	int arr[] = {95,26,32,15,108,67};
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
		printf("%d\n", *(arr + i));
	}
	return 0;
}
#include <stdio.h>

using namespace std;

int main() {
	int arr[] = {95,26,32,15,108,67};
	int *p_arr = arr;
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
		printf("%d\n", *p_arr++);
	}
	return 0;
}

3、字符数组和字符串常量

        ● C 语言还支持另一种方式表示字符串;

           字符串的所有字符在内存中都是连续排列的;

           str 指向字符串的第 0 个字符,称为首地址;

           字符串中每个字符的类型都是 char,所以 str 的类型也必须是 char*;

#include <stdio.h>
#include <string.h>

using namespace std;

int main() {
    //这种声明方法 str 是放在常量区的
	const char *str = "Hello World!";
	printf("%#x\n", str);
    
    //由于 str 存储在常量区,我们无法对其中单个元素进行重新赋值
    str[1] = 'p';

    //整个重新赋值之后,str 变成了变量,地址改变了
	str = "I love C!";  //正确
	printf("%#x\n", str);
	return 0;

	//输出结果:
	//0x747cd0
	//0x747bd4
}
#include <stdio.h>
#include <string.h>

using namespace std;

int main() {
    //C语言不需要写const,C++必须写
    //因为这种写法的字符串时存储在常量区的
	const char *str = "www.csdn.net";
	const char *p_str = str;

	//直接输出
	printf("%s\n", str);

	//*(str+i)
	for (int i = 0; i < strlen(str); i++) {
		printf("%c", *(str+i));
	}
	printf("\n");

	//*p_str++
	for (int i = 0; i < strlen(str); i++) {
		printf("%c", *p_str++);
	}
	return 0;
}
#include <stdio.h>
#include <string.h>

using namespace std;

int main() {
	char str[] = "www.csdn.net";
	char *p_str = str;

	//直接输出
	printf("%s\n", str);

	//*p_str++ 方式
	for (int i = 0; i < sizeof(str); i++) {
		printf("%c", *p_str++);
	}
	printf("\n");

	//*(str+i) 方式
	for (int i = 0; i < sizeof(str); i++) {
		printf("%c", *(str + i));
	}
	printf("\n");

	//str[i] 方式
	for (int i = 0; i < sizeof(str); i++) {
		printf("%c", str[i]);
	}
	printf("\n");

	return 0;
}

4、两种不同的指针遍历方式

#include <stdio.h>
#include <string.h>

using namespace std;

int main() {
	char str[] = "天上白玉京,十二楼五城。";
	char *p_str = str;

	//*转存首地址指针++
	for (int i = 0; i < sizeof(str);i++) {
		printf("%c",*p_str++);
	}

	printf("\n");

	//*(数组名+i) 
	for (int i = 0; i < sizeof(str); i++) {
		printf("%c", *(str+i));
	}

	printf("\n");

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值