印度小哥讲解的指针, 真的很好, 这里附上链接:
https://www.bilibili.com/video/BV1bo4y1Z7xf/?spm_id_from=333.999.0.0
1 明确“字符串”的概念
对于字符串, 我们需要分配的数组大小至少要是 >= 字符数目
, 比如 Jonh
这四个字符, 就至少要 5个字符数组
的大小, 不然就会出现乱码的情况, 因为最后一定是要有一个 '\0'
的, 当然, 一般来说都是会自动进行添加的.
int main() {
char C[] = "John";
printf("C的字节数为:%zu\n", sizeof(C));
int len = strlen(C);
printf("C的长度为:%d", len);
return 0;
}
int main() {
char C[5];
C[0] = 'J';
C[1] = 'O';
C[2] = 'H';
C[3] = 'N';
C[4] = '\0';
printf("%s", C);
return 0;
}
2. 指针和数组
2.1 数组和指针相似的地方
尽管指针和数组有时候使用起来相似, 但是它们不是同一个类型.
int main() {
char c1[] = "hello";
char* c2;
c2 = c1; // 将c2指针指向了c1对应的地址. 接下来也就能直接用c2进行操作.
c2[0] = 'y';
*(c2) = 'a'; // 效果是一样的.
printf("%s", c1);
return 0;
}
2.2 数组和指针不相同的地方
数组
不能进行相加减, 但是 指针
可以执行这样的操作.
要求我们很清楚的知道什么时候我们使用的是指针, 什么时候使用的是数组.
//int main() {
// char c1[] = "hello";
// char* c2;
// c1 = c2; // 这样做是不对的, 数组不能指向一个指针. 也不能进行“+, -”, 都是不对的,
// c1 = c1 + 1; // 这样做是不对的, 会发生编译错误.
// printf("%s", c1); // 这样就要求我们很清楚的知道什么时候我们使用的是指针, 什么时候使用的是数组.
// return 0;
//}
3. 字符数组作为参数
基本上和原来的是一样的, 最需要注意的就是 传递过去的是对应“基地址”
, 这个都是一样的, 对于指针的修改都是对于原来的地址, 不是将整个复制过去, 下面的这个例子主要是为了加深印象.
具体解释在 7. 数组作为函数参数:1.2 用内存结构解释这个问题
void print(char* c) {
int i = 0;
while (c[i] != '\0') {
printf("%c", *(c + i));
i++;
}
printf("\n");
}
int main() {
char c[10] = "Hello";
print(c);
return 0;
}
/
void print(char* c) {
int i = 0;
while (*c != '\0') {
printf("%c", *c);
c++;
}
printf("\n");
}
int main() {
char c[10] = "Hello";
print(c);
return 0;
}
3.1 对于上述代码的解释
利用指针指向 main函数栈帧
中不同的位置.