編寫程序:初始化double數組,分別用數組符號與指針符號實現兩個拷貝函數,參數為目標數組名與元素個數。
double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
double target1[5], target2[5];
copy_arr(source, target1, 5); // 數組符號
copy_ptr(source, target2, 5); // 指針符號
#include <stdio.h>
void copy_arr(double s[], double tar[], int c); // 數組寫法
void copy_ptr(double *s, double *tar, int c); // 指針寫法
int main(void) {
double s[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
double t1[5], t2[5];
copy_arr(s, t1, 5);
copy_ptr(s, t2, 5);
printf("t1\t\tt2\n");
for (int i = 0; i < 5; i++)
printf("t1[%d]=%.1f\t t2[%d]=%.1f\n", i, t1[i], i, t2[i]);
return 0;
}
// 數組符號實現
void copy_arr(double s[], double tar[], int c) {
for (int i = 0; i < c; i++)
tar[i] = s[i];
}
// 指針符號實現
void copy_ptr(double *s, double *tar, int c) {
for (int i = 0; i < c; i++)
*(tar + i) = *(s + i);
}
利用指針自增遍歷,更貼近底層:
void copy_arr(double s[], double tar[], int c) {
int i = 0;
while (i < c) tar[i] = s[i++];
}
void copy_ptr(double *s, double *tar, int c) {
int i = 0;
while (i < c) *(tar + i) = *(s + i++);
}
// 或更極致的指針走位(修改指針本身,需臨時變量)
void copy_ptr_v2(double *s, double *tar, int c) {
double *end = s + c;
while (s < end) *tar++ = *s++;
}
| 維度 | 數組參數 double s[] | 指針參數 double *s |
|---|---|---|
| 本質 | 退化為指針 double *s | 顯式指針 |
| 函數內sizeof | 指針大小(非數組大小) | 指針大小 |
| 語義表達 | 暗示「這是一個數組」 | 暗示「這是一個地址」 |
| 指針算術 | 可用 s[i]、*(s+i) | 同樣可用,亦可 *s++ |
| 調用兼容性 | 完全兼容,可互換 | 完全兼容,可互換 |
type arr[],處理單個元素/指針運算用type *ptrconst double *s或const double s[]*tar++ = *s++)會修改指針值,若後續仍需原始指針請用臨時變量