指针和字符串
一步一步的往下研究
#include<stdio.h>
void main() {
char arr[] = "hello";
char* p = arr;
printf("%s\n", arr);
printf("%s\n", p);
}
尝试写在一起,看一看有什么区别
存储在常量区的数据如果相同只会开辟一份
void main() {
char arr[] = "hello"; //存储在栈区
char* p = "hello"; //存储在数据常量区
arr[2] = 'k'; //可以更改
//p[2] = 'k'; 不可以更改
//*(p + 2) = 'k';也不可以更改
printf("%s\n", arr);
printf("%s\n", p);
//既然存储在数据常量区了,可以看一下如果数据相同,地址会不会相同
char* p1 = "hello";
printf("p的地址为:%p\n", p);
printf("p1的地址为:%p\n", p1);
/*p的地址为:003E7B30
p1的地址为:003E7B30*/
//可以看出地址是完全相同的,也就是两个指针指向的是同一个地址
}
指针数组和字符串数组
指针数组是可以修改的
字符串数组是不可以修改的
void main(){
//指针数组 (可以修改)
char arr1[] = "hello";
char arr2[] = "chen";
char arr3[] = "123";
//char* arr[] = { arr1,arr2,arr3 };
//字符串数组 (不可以修改)
char* arr[] = { "hello","chen","123" };
//遍历字符串数组
for (int i = 0; i < 3; i++) {
printf("%s\n", arr[i]);
}
//打印字符串数组的首个元素
for (int i = 0; i < 3; i++) {
printf("%c\n", arr[i][0]);
}
}
遍历字符串数组
交换地址,就完成了数据的交换
字符串数组本来数据就不能改变,但是指针字符串数组的数据时可以改变的,但还是最好采用交换地址的方式,不是每一个字符串都是一样长的
void main() {
//字符串数组 (不可以修改)
char* arr[] = { "hello","chen","wwww" };
//使用冒泡排序对字符串数组进行排序
for (int i = 0; i < 3 - 1; i++) {
for (int j = 0; j < 3 - 1 - i; j++) {
//获取数组的首元素,比较ascii码
if (arr[j][0] > arr[j + 1][0]) { //大于就交换,是升序
//定义一个临时变量
char* temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//遍历一下数组看一看对不对
for (int i = 0; i < 3; i++) {
printf("%s\n", arr[i]);
}
}
字符指针作为函数参数
例如
//数组的写法
int my_lens01(char* arr) {
int len=0;
while (arr[len] != '\0')
len++;
return len;
}
//在用指针写一个
int my_lens(char* arr) {
char* temp = arr;
while (*temp != '\0')
//条件直接写成(*temp)也是可以的
temp++;
return temp - arr;
}
void main() {
char arr[] = "abcdef";
printf("%d\n", my_lens(arr));//输出6
char arr2[] = "abc\0def";
printf("%d\n", my_lens(arr2));//输出3 ,遇到\0直接终止了
}
补充数组作为函数参数会退化为指针