数组在内存中是连续存储的,只要知道第一个元素的地址,后面的元素依次就能找到。
int arr[]={1,2,3,4,5};
而所对应的下标为0,1,2,3,4。
在对不同类型指针变量加减时结果不同, 举个例子:
#include <stdio.h>
int main()
{
int n = 10;
int* p1 = &n;
char* p2 = &n;
printf("p1=%p\n", p1);
printf("p1+1=%p\n", p1+1);
printf("p2=%p\n", p2);
printf("p2+1=%p\n", p2+1);
return 0;
}
在下面为结果 int类型的就跳过了4个字节, char类型就跳过1个字节
结论: 指针的类型决定了,指针加减整数时,一次性跳过多少个字节。
在指针变量相同类型时,计算出的是中间间隔的个数。 举个例子:
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int* p1 = &arr[9];
int* p2 = &arr[0];
int ret = p1-p2 ;
printf("%d\n", ret);
return 0;
}
结果为
指针类型不同时不能进行指针的加减运算。
计算数组的元素个数时,我们使用了sizeof(数组名),而sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。 sizeof(arr[0])计算的是首元素的大小,单位也是字节。
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}
数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外: 1.sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。 2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。 除此之外,任何地方使用数组名,数组名都表示首元素的地址。