京東上怎樣做網(wǎng)站網(wǎng)推公司
目錄
- 一、使用指針訪問數(shù)組
- 二、數(shù)組名的理解
- 1、數(shù)組首元素的地址
- 2、整個數(shù)組
- 三、一維數(shù)組傳參的本質(zhì)
- 四、冒泡排序
- 五、二級指針
- 六、指針數(shù)組
一、使用指針訪問數(shù)組
可以使用指針來訪問數(shù)組元素。例如,可以聲明一個指針變量并將其指向數(shù)組的第一個元素,然后通過遞增指針的方式來訪問數(shù)組的其他元素:
#include<stdio.h>
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int* ptr = arr; // 指針指向數(shù)組的第一個元素for (int i = 0; i < 5; i++){printf("%d ", *ptr); // 訪問數(shù)組元素ptr++; // 指針遞增,指向下一個元素}return 0;
}
- 輸出結(jié)果:
二、數(shù)組名的理解
在C語言中,數(shù)組名有時代表數(shù)組中首元素的地址,有時代表整個數(shù)組,視情況而定。
1、數(shù)組首元素的地址
例1: 定義一個整型數(shù)組arr,可以用數(shù)組名arr表示數(shù)組的首地址,作為參數(shù)傳遞給函數(shù):
#include<stdio.h>void printArray(int arr[], int size)
{for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main()
{int arr[5] = {1, 2, 3, 4, 5};printArray(arr, 5);return 0;
}
- 輸出結(jié)果:
這里,printArray函數(shù)的參數(shù)形式為int arr[],實際上是將數(shù)組名arr作為指針常量傳遞給函數(shù)。
例2: 用數(shù)組名訪問數(shù)組中的元素:
#include<stdio.h>
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int* ptr = arr;printf("%d\n", *ptr); // 輸出1ptr++;printf("%d\n", *ptr); // 輸出2return 0;
}
- 輸出結(jié)果:
這里,arr和ptr都指向數(shù)組的第一個元素,可以通過指針操作來訪問數(shù)組的元素。
2、整個數(shù)組
例1: sizeof中單獨放數(shù)組名,這?的數(shù)組名表?整個數(shù)組,計算的是整個數(shù)組的??(單位是字節(jié)):
#include<stdio.h>
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int size = sizeof(arr);printf("%d\n", size);return 0;
}
- 輸出結(jié)果:
例2: &數(shù)組名,這?的數(shù)組名表?整個數(shù)組,取出的是整個數(shù)組的地址(整個數(shù)組的地址和數(shù)組?元素的地址是有區(qū)別的)
#include<stdio.h>
int main()
{int arr[5] = { 1,2,3,4,5 };printf("&arr[0] = %p\n", &arr[0]);printf("&arr[0]+1 = %p\n", &arr[0] + 1);printf("arr = %p\n", arr);printf("arr+1 = %p\n", arr + 1);printf("&arr = %p\n", &arr);printf("&arr+1 = %p\n", &arr + 1);return 0;
}
- 輸出結(jié)果:
這?我們發(fā)現(xiàn)&arr[0]和&arr[0]+1相差4個字節(jié),arr和arr+1相差4個字節(jié),是因為&arr[0]和arr都是?元素的地址,+1就是跳過?個元素。
但是&arr和&arr+1相差20個字節(jié),這就是因為&arr是數(shù)組的地址,+1操作是跳過整個數(shù)組的。
除了這兩個例子之外,其他任何地?使?數(shù)組名都表??元素的地址。
三、一維數(shù)組傳參的本質(zhì)
在C語言中,一維數(shù)組傳參時,實際上傳遞的是數(shù)組的首地址,也就是數(shù)組名。函數(shù)可以通過修改傳入的數(shù)組來修改實際的數(shù)據(jù)。
#include<stdio.h>void modifyArray(int arr[], int size)
{for (int i = 0; i < size; i++) {arr[i] *= 2; // 修改數(shù)組元素}
}int main()
{int arr[5] = {1, 2, 3, 4, 5};modifyArray(arr, 5); // 傳遞數(shù)組名作為參數(shù)for (int i = 0; i < 5; i++) {printf("%d ", arr[i]); // 輸出修改后的數(shù)組}return 0;
}
- 輸出結(jié)果:
四、冒泡排序
冒泡排序是一種基本的排序算法,通過多次比較和交換來實現(xiàn)。算法的核心思想是從數(shù)組的第一個元素開始,依次比較相鄰的兩個元素,如果前一個元素大于后一個元素,則交換它們的位置。
#include<stdio.h>void bubbleSort(int arr[], int size)
{for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main()
{int arr[5] = {5, 4, 3, 2, 1};bubbleSort(arr, 5);for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}
- 輸出結(jié)果:
五、二級指針
二級指針是指向指針的指針。通過使用二級指針,可以在函數(shù)中修改指針的值,間接修改指針指向的變量。
#include<stdio.h>void changeValue(int **ptr)
{int newValue = 10;*ptr = &newValue; // 修改二級指針指向的變量
}int main()
{int value = 5;int *ptr = &value;changeValue(&ptr); // 傳遞二級指針作為參數(shù)printf("%d", *ptr); // 輸出修改后的值return 0;
}
- 輸出結(jié)果:
六、指針數(shù)組
指針數(shù)組是一個數(shù)組,其中的每個元素都是指針。通過指針數(shù)組,可以存儲多個指針,并進行相應的操作。
#include<stdio.h>int main()
{int a = 1, b = 2, c = 3;int *ptrArray[3]; // 聲明指針數(shù)組ptrArray[0] = &a; // 將指針賦值給數(shù)組元素ptrArray[1] = &b;ptrArray[2] = &c;for (int i = 0; i < 3; i++) {printf("%d ", *ptrArray[i]); // 輸出數(shù)組元素指向的值}return 0;
}
- 輸出結(jié)果: