数组与指针
1、定义
#include<stdio.h>
int main(){
int arr1[5] = { 0, 1, 2, 3, 4};
int arr2[] = { 0, 1, 2, 3, 4};
int arr3[5] = { 0, 1, 2};
int i = 0;
while( i < 5){
printf("%d\t",arr1[i]);
i += 1;
}
printf("\n");
i = 0;
while( i < 5){
printf("%d\t",arr2[i]);
i += 1;
}
printf("\n");
i = 0;
while( i < 5){
printf("%d\t",arr3[i]);
i += 1;
}
printf("\n");
return 0;
}
字符类型的数组可以看第三节。
2、一维数组与指针
#include <stdio.h>
int main(){
int arr[] = { 0, 1, 2};
int sz = sizeof(arr) / sizeof(arr[0]);
int i;
for(i = 0; i < sz; i++){
printf("arr[%d] = %d\n", i, arr[i]);
printf("*(arr+%d) = %d\n", i, *(arr+i));
}
printf("size = %d\n",sz);
return 0;
}
一般情况下,数组名和数组首元素地址等价。但是有2个例外。
例外1:当使用sizeof(数组名)时,这里的数组名指的是整个数组。sizeof(数组名)指的是数组所占用的空间,单位字节(Byte)。
例外2:当使用&数组名时,这里的数组名指的是整个数组。&数组名是取整个数组的地址(详见《碰到的一些有意思的、琐碎的知识》)。
3、二维数组
二维数组定义:
#include <stdio.h>
int main(){
int i = 0;
int j = 0;
//def 1
int arr1[3][3] = {
{1, 2},
{3, 4},
{5, 6}};
int arr2[3][3] = { 1, 2, 3, 4, 5, 6, 7};
int arr3[3][3] = {
{1, 2},
{3, 4}
};
printf("arr1:\n");
for(i = 0; i < 3; i += 1){
for(j = 0; j < 3; j += 1){
printf("%d\t",arr1[i][j]);
}
printf("\n");
}
printf("arr2:\n");
for(i = 0; i < 3; i += 1){
for(j = 0; j < 3; j += 1){
printf("%d\t",arr2[i][j]);
}
printf("\n");
}
printf("arr3:\n");
for(i = 0; i < 3; i += 1){
for(j = 0; j < 3; j += 1){
printf("%d\t",arr3[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
arr1:
1 2 0
3 4 0
5 6 0
arr2:
1 2 3
4 5 6
7 0 0
arr3:
1 2 0
3 4 0
0 0 0
4、二维数组与指针
#include <stdio.h>
int main(){
int arr[3][3];
int* p = arr[0];
printf("&arr[0][0] : %p\n", &arr[0][0]);
printf("&arr[0][0] + 1 : %p\n", &arr[0][0] + 1);
printf("arr : %p\n", arr);
printf("arr + 1 : %p\n", arr + 1);
printf("p = arr : %p\n", p);
return 0;
}
运行结果:
&arr[0][0] : 0x7ffe227dce90
&arr[0][0] + 1 : 0x7ffe227dce94
arr : 0x7ffe227dce90
arr + 1 : 0x7ffe227dce9c
p = arr : 0x7ffe227dce90
arr指的是数组arr[0],使用arr + 1所指的地址与arr[0] + 1一样。
5、指针常量与常量指针
指针常量
指针常量的定义:int* const p。该定义表示p这个指针所指向的地址是不能改变的。
代码:
#include <stdio.h>
int main(){
int a = 1;
int b = 2;
int* const pa = &a;
printf("%d\n", *pa);
pa = &b;
printf("%d\n", *pa);
return 0;
}
无法编译,因为pa是常量,无法改变其值。
常量指针
而常量指针就不会无法改变pa的值。代码如下。
代码:
#include <stdio.h>
int main(){
int a = 1;
int b = 2;
const int* pa = &a;
printf("%d\n", *pa);
pa = &b;
printf("%d\n", *pa);
return 0;
}
与定义指针常量的代码相比,该段代码编译时不会报错,且运行结果如下:
1
2
常量指针的定义:int const* p或const int* p。这个定义方式表示p指向的地址中的值对于指针p而言是常量。也就意味着不能通过解引用的方式来改变p所指向的地址中的值。但可以通过其他方式改变p所指向的地址中的值。代码如下。
代码:
#include <stdio.h>
int main(){
int a = 1;
const int* pa = &a;
printf("%d\n", *pa);
*pa = 2;
printf("%d\n", *pa);
return 0;
}
编译时会报错。
代码:
#include <stdio.h>
int main(){
int a = 1;
const int* pa = &a;
printf("%d\n", *pa);
a = 2;
printf("%d\n", *pa);
return 0;
}
编译时不会报错,且运行结果如下:
1
2