一、数组名->首元素地址
#include <stdio.h>
void exchange(int array1[], int array2[], int sz)
{
int i = 0;
int temp = 0;
for (i = 0; i < sz; i++)
{
temp = *array1;
*array1 = *array2;
*array2 = temp;
if (i == sz - 1)
{
break;
}
else
{
array1++;
array2++;
}
}
}
int main()
{
int arr1[] = { 0, 1, 2, 3, 4, 5, 6 };
int arr2[] = { 6, 5, 4, 3, 2, 1, 0 };
int size = sizeof(arr1) / sizeof(int);
exchange(arr1, arr2, size);
int i = 0;
for (i = 0; i < size; i++)
{
printf("%d", arr1[i]);
}
printf("\n");
for (i = 0; i < size; i++)
{
printf("%d", arr2[i]);
}
return 0;
}
上面的代码可以成功将两个大小相同的数组进行内容交换,
从上面的代码中可以看出,当形式参数是 int array[]的形式时实际上是数组的首地址,所以在下面可以当指针来运算,进行array1++; array2++;
和 temp = *array1; *array1 = array2; array2 = temp; 运算。
同时, 这里如果在函数中用 sizeof(array)会得到指针的大小。
void exchange(int array1[], int array2[], int sz) 与void exchange(int array1, int array2, int sz)的用法是一样的。
#include <stdio.h>
void exchange(int *array1, int *array2, int sz)
{
int i = 0;
int temp = 0;
for (i = 0; i < sz; i++)
{
temp = array1[i];
array1[i] = array2[i];
array2[i] = temp;
}
}
int main()
{
int arr1[] = { 0, 1, 2, 3, 4, 5, 6 };
int arr2[] = { 6, 5, 4, 3, 2, 1, 0 };
int size = sizeof(arr1) / sizeof(int);
exchange(arr1, arr2, size);
int i = 0;
for (i = 0; i < size; i++)
{
printf("%d", arr1[i]);
}
printf("\n");
for (i = 0; i < size; i++)
{
printf("%d", arr2[i]);
}
return 0;
}
像上述代码加了下标引用操作符也是可以的。
在主函数中如果定义了一个指针int *p,存储数组的首地址(及数组名 array或arr[0]),是可以把这个指针当做数组运用的,p[i]是成立的。
并且因为数组名是数组的首地址,所以在输入是不要加&取地址符的直接scanf(“%d”, arr + i);
数组名是数组首元素的地址
但是有2个例外:
sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址()
除此之外,遇到的所有的数组名都输数组首元素的地址
二、数组的指针加一与数组名加一
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int * p = &arr[0];
//char * pc;
for (i = 0; i < sz; i++)
{
printf("%p == %p\n", p + i, &arr[i]);
printf("%d ", *(p + i));
}
return 0;
}
指针加1是会出现直接加数据类型的所占大小。
#include <stdio.h>
//数组名是数组首元素的地址
//但是有2个例外:
//sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小(自定义函数中sizeof加数组名为指针类型所占字节)
//&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
// 而像最后一个printf("%p\n", arr + 1);与printf("%p\n", &arr[0]+1);表示一个意思。
//除此之外,遇到的所有的数组名都输数组首元素的地址
//
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", arr+1);
printf("%p\n", &arr[0]);
printf("%p\n", &arr[0]+1);
printf("%p\n", &arr);
printf("%p\n", &arr+1);
printf("%p\n", arr);
printf("%p\n", arr + 1);
//printf("%d\n", sizeof(arr));//40
return 0;
}
//数组名是数组首元素的地址
//但是有2个例外:
//sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小(自定义函数中sizeof加数组名为指针类型所占字节)
//&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
// 而像最后一个printf(“%p\n”, arr + 1);与printf(“%p\n”, &arr[0]+1);表示一个意思。
//除此之外,遇到的所有的数组名都输数组首元素的地址
//
三、数组的赋值
1. 直接赋值
int arr[] = {0, 1, 2, 3, 4};
2. 遍历赋值
#define SIZE 5
#include <stdio.h>
void init(int arr[])
{
int i = 0;
for (i = 0; i < SIZE; i++)
{
arr[i] = 0;
}
}
int main()
{
int array[5];
init(array);
return 0;
}
3. 错误示范
int array[5] = {0};
array = { 0, 1, 2, 3, 4 };
除了定义变量的情况下其他情况是不能对通过一个等式直接将数组元素赋给数组。
四、数组在函数中
void InitBoard(int row, int col, char array[][COLS], char character);
数组作为函数参数时一般将数组的大小一并传送给函数,即数组大小作为形参。