字符串与数组、指针
1. 一维数组、指针
对于字符串“ABCD”
一维数组:char str[] = "ABCD"; 或者 char str[] = {'A', 'B', 'C', 'D', '\0'}; 或者 char str[5] = {'A', 'B', 'C', 'D', '\0'};
指针:char *p = "ABCD"; 或者 char *p = str;
2. 二维数组、二维指针
对于字符串“ABCD”,“abcd"
二维数组:
char str[][5] = {"ABCD", "abcd"};
// char str[][5] = {{'A', 'B', 'C', 'D', '\0'}, {'a', 'b', 'c', 'd', '\0'}};
printf("%s\n", str[0]);
printf("%s\n", str[1]);
printf("%c\n", str[1][0]);
指针指向二维数组:
注意:不能这样直接指向二维数组(二维数组是连续存储的,不需要也不能取2次地址):char **p = (char **)str;
应该这样:
char *p = str[0];
printf("%s\n", p);
printf("%c\n", p[0]);
或者用数组指针
char (*p)[3] = str;
char (*p)[5] = str;
printf("%s\n", p[0]);
printf("%s\n", p[1]);
printf("%c\n", p[0][0]);
一维数组作为函数参数
1. void fun(char p[], int len);
2. void fun(char *p, int len);
注意:即使形参定义为数组形式char p[],但是传输进去的实参是指针。此时使用sizeof获取的是真正的大小4,而不是数组的长度,所有数组的长度需要单独传入。
二维数组作为函数参数
1. void fun(char p[][10], int len);
注意:数组的列必须指定
二级指针
int a = 10;
int *p = &a;
int **p2 = &p;
// int *p, **p2;
// p = &a;
// p2 = &p;
printf("%d %d %d", a, *p, **p2);
二级指针作为函数参数
如何实现字符串赋值
1. 定义数组
// 传入的指针必须指向具体的内存,不能是空指针或野指针
void fun(char *str) {
memcpy(str, “abc”, 4);
}
int main(int argc, char *argv[]) {
char arr[10];
fun(arr);
printf("%s\n", arr);
}
2. 定义指针
void fun(char *str) {
str = (char *)malloc(4);
if(NULL != str){ // 注意:str指向的地址有改变
memcpy(str, "abc", 4);
printf("str=%d\n", str);
printf("str: %s\n", str);
}
}
int main(int argc, char *argv[]) {
char *p = NULL;
printf("p=%d\n", p);
fun(p);
printf("p=%d\n", p); // 注意:p指向的地址没有改变
printf("p: %s\n", p);
}
指针P指向的内存地址还是0x0,没有改变
原因:指针就是内存地址,是long类型的数值。调用fun时,将地址拷贝传入。一般情况下,我们是使用或改变指针指向的内存的值,但是现在改变了指针的指向,指向了另一片内存。
3. 二级指针
void fun(char **str) {
*str = (char *)malloc(4);
if(NULL != *str){
memcpy(*str, "abc", 4);
printf("str=%d\n", *str);
printf("str: %s\n", *str);
}
}
int main(int argc, char *argv[]) {
char *p = NULL;
printf("p=%d\n", p);
fun(&p);
printf("p=%d\n", p);
printf("p: %s\n", p);
}