二维数组形式的字符串数组
char sa[][10] = {"beijing","tianjing","shanghai',"chongqing"}; //二维数组第二个[]是必须定义大小的
注意!!!:
strcpy(str[0], "hebei"); //可以修改!
strcpy[0][1] = 'E'; //也可以修改!
但是!!!!!!
strcpy[0] = "hebei"; //不允许修改!!!!
因为二维数组里的每一格一维数组名是一个指针常量,其地址不允许修改!只能改变指向地址的内存值!!
示例:
char str[][20] = {"beijing", "tianjing", "shanghai", "chongqing"};
//打印字符串
for(int i = 0; i < sizeof(str)/sizeof(str[0]); i++)
printf("%s ", str[i]);
printf("\n");
strcpy(str[0], "hebei"); //可以修改
str[0][1] = 'E'; //可以修改
//str[0] = "sichuan"; //不允许
//打印字符串
for(int i = 0; i < sizeof(str)/sizeof(str[0]); i++)
printf("%s ", str[i]);
printf("\n");
return 0;
}
指针数组
指针数组是每个元素都是指针的数组
int a, b, c;
int* ptr_arr[] = {&a, &b, &c};
//指针数组演示
#include <stdio.h>
int main(void) {
int a = 10;
int b = 20;
int c = 30;
//定义初始化指针数组包含三个变量的地址
int *parr[] = {&a, &b, &c};
int size = sizeof(parr)/sizeof(parr[0]);
//*parr[1] = *&b
//**(parr+1) = *&b
for(int i = 0; i < size; i++)
printf("%d, %d\n", *parr[i], **(parr+i));
for(int i = 0; i < size; i++){
*parr[i] *= 10;
**(parr+i) *= 10;
}
for(int i = 0; i < size; i++)
printf("%d, %d\n", *parr[i], **(parr+i));
return 0;
}
指针数组形式的字符串数组
const char *sa[] ={"beijing","tianjing","shanghai',"chongqing"}; //实际是把字符串的地址放到指针中,注意这里的const!!!!!!!!!此处定义的是一个常量指针数组
同时回忆定义指针表示字符串时
const char *sa = "beijing";
所以!!指针数组形式是一个常量指针,其指向地址的内存值不可修改,但是其指向的地址可以修改。
这一点,区别于二维数组存储字符串时,a[][],前边的a[]是一维数组的地址,是不可更改的,但是内存值可以修改。指针数组是不可以修改指向地址的内存值,但是地址可以更改!!
//指针数组来表示字符串数组
#include <stdio.h>
int main(void) {
//指针数组放的不是字符串放的是字符串的首地址
char *arr[] = {"beijing", "tianjing", "shanghai", "chongqing"};
//等价于:
//char *arr0 = "beijing", *arr1 = "tianjing", *arr2 = "shanghai", *arr3 = "chongqing"
//打印
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
printf("%s ", arr[i]);
printf("\n");
//strcpy(arr[0], "hebei"); //不允许
arr[0] = "hebei"; //可以,arr[0]元素来保存字符串hebei首地址
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
printf("%s ", arr[i]);
printf("\n");
return 0;
}
C语言指针看container_of