1 数组
int a[5] = {1,2,3,4,5};//在内存中分配5个int类型的内存空间,共4*5=20个字节
数组名a经常被隐式的转换为指向数组首元素的指针常量
2 数组指针
指向数组的指针叫做数组指针。
int a[5] = {1,2,3,4,5}, *p; p=a;
这时,下面两列取值,取地址操作是等价的。同时应注意&a[i]和&a[i+1]、a+i和a+i+1、&p[i]和&p[i+1]、p+i和p+i+1差值在32位系统中是4,而不是1.
取地址 | 取值 |
&a[i] | a[i] |
a+i | *(a+i) |
&p[i] | p[i] |
p+i | *(p+i) |
2.1 以指针的方式遍历数组元素
int arr[]={11, 22, 33, 44, 55 }; int len = sizeof(arr)/sizeof(int); //求数组长度 char i; for(i=0; i<len; i++) { printf("%d ", *(arr+i)); //*(arr+i)等价于arr[i] }
arr是int*类型,每次加1时,arr自身的值(地址)会增加sizeof(int)。
2.2 以数组指针的方式遍历数组元素
int arr[]={11. 22, 33, 44, 55 }; int len = sizeof(arr)/sizeof(int), *p=&arr; //等价于*p=&arr[0] char i; for(i=0; i<len; i++) { printf("%d ", *(p+i)); //*(p+i)等价于*(arr+i) }
p、arr、&arr[0] 等价
*(p+i)、*(arr+i)、arr[i]、p[i ]等价
2.3 借助自增运算符遍历数组元素
不管是数组名还是数组指针,都可以用上面的两种方式来访问数组元素,不同的是:数组名是常量,他的值不能被改变;数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。
int arr[]={11. 22, 33, 44, 55 }; int len = sizeof(arr)/sizeof(int), *p=&arr; //等价于*p=&arr[0] char i; for(i=0; i<len; i++) { printf("%d ", *p++); //*p++等价于*(p++) }
*p++不能改为*arr++,因为arr是常量,而arr++相当于arr=arr+1会改变它的值。
int *p=&arr[2]
3 字符串指针
3.1 字符串指针
char str[]="https://www.cnblogs.com/Mike2019/"; char *pstr=str; int len=strlen(str), i; //使用*(pstr+i)或*(pstr++) for(i=0; i<len; i++){ printf("%c", *(pstr++)); } printf(" "); //使用pstr[i] for(i=0; i<len; i++){ printf("%c", pstr[i]); } printf(" "); //使用*(str+i) for(i=0; i<len; i++){ printf("%c", *(str+i)); //这里不能用*(str++),因为str是数组,他是常量 } printf(" "); //使用str[i] for(i=0; i<len; i++){ printf("%c", str[i]); } printf(" ");
3.2 字符串常量与字符串数组
(1)字符串常量
char *str="https://www.cnblogs.com/Mike2019/"; //定义一个字符串常量,存储在内存的静态存储区,所以str所指向地址里的数据是不能被改变的。
或者
char *str; str="https://www.cnblogs.com/Mike2019/";
(2)字符串数组
char str[10] = "hello"; //定义一个字符串数组,存储在动态存储区,数据是可以被改变的
字符串数组和字符串常量两者的区别是:字符串数组存储在全局数据区或者栈区,字符串常量存储在常量区。也就是字符串常量不可以被修改。
"hello"其实就是一个常量,在初始化数组的时候出现的"hello"只是一种特殊情况。
4 指针数组
所有元素都是指针的数组叫指针数组。指针数组是多个指针变量,以数组的形式存在内存当中,占有多个指针的存储空间。
int *p[3]; //定义一个存放着三个指针变量的一维数组 int a[3][4]; for(i=0; i<3; i++) { p[i] = a[i]; //将二维数组每一行首地址指向p[i] }