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;
}