首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言指針與數組作為函數參數傳遞的區別與寫法

     編輯:關於C語言

C語言指針與數組作為函數參數傳遞的區別與寫法

題目要求

編寫程序:初始化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++
調用兼容性完全兼容,可互換完全兼容,可互換

最佳實踐建議

  1. 語義清晰:處理數組整體用type arr[],處理單個元素/指針運算用type *ptr
  2. 配合const:只讀數組用const double *s或const double s[]
  3. 傳遞長度:C語言數組傳參不攜帶長度信息,必須額外傳遞元素個數
  4. 避免副作用:指針增量操作(*tar++ = *s++)會修改指針值,若後續仍需原始指針請用臨時變量
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved