一、使用指針訪問數(shù)組
可以使用指針來(lái)訪問數(shù)組元素。例如,可以聲明一個(gè)指針變量并將其指向數(shù)組的第一個(gè)元素,然后通過(guò)遞增指針的方式來(lái)訪問數(shù)組的其他元素:
#include<stdio.h>
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
int* ptr = arr; // 指針指向數(shù)組的第一個(gè)元素
for (int i = 0; i < 5; i++)
{
printf("%d ", *ptr); // 訪問數(shù)組元素
ptr++; // 指針遞增,指向下一個(gè)元素
}
return 0;
}
- 輸出結(jié)果:
二、數(shù)組名的理解
在C語(yǔ)言中,數(shù)組名有時(shí)代表數(shù)組中首元素的地址,有時(shí)代表整個(gè)數(shù)組,視情況而定。
1、數(shù)組首元素的地址
例1: 定義一個(gè)整型數(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í)際上是將數(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); // 輸出1
ptr++;
printf("%d\n", *ptr); // 輸出2
return 0;
}
- 輸出結(jié)果:
這里,arr和ptr都指向數(shù)組的第一個(gè)元素,可以通過(guò)指針操作來(lái)訪問數(shù)組的元素。
2、整個(gè)數(shù)組
例1: sizeof中單獨(dú)放數(shù)組名,這?的數(shù)組名表?整個(gè)數(shù)組,計(jì)算的是整個(gè)數(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ù)組名表?整個(gè)數(shù)組,取出的是整個(gè)數(shù)組的地址(整個(gè)數(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個(gè)字節(jié),arr和arr+1相差4個(gè)字節(jié),是因?yàn)?amp;arr[0]和arr都是?元素的地址,+1就是跳過(guò)?個(gè)元素。
但是&arr和&arr+1相差20個(gè)字節(jié),這就是因?yàn)?amp;arr是數(shù)組的地址,+1操作是跳過(guò)整個(gè)數(shù)組的。
除了這兩個(gè)例子之外,其他任何地?使?數(shù)組名都表??元素的地址。
三、一維數(shù)組傳參的本質(zhì)
在C語(yǔ)言中,一維數(shù)組傳參時(shí),實(shí)際上傳遞的是數(shù)組的首地址,也就是數(shù)組名。函數(shù)可以通過(guò)修改傳入的數(shù)組來(lái)修改實(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é)果:
四、冒泡排序
冒泡排序是一種基本的排序算法,通過(guò)多次比較和交換來(lái)實(shí)現(xiàn)。算法的核心思想是從數(shù)組的第一個(gè)元素開始,依次比較相鄰的兩個(gè)元素,如果前一個(gè)元素大于后一個(gè)元素,則交換它們的位置。
#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é)果:
五、二級(jí)指針
二級(jí)指針是指向指針的指針。通過(guò)使用二級(jí)指針,可以在函數(shù)中修改指針的值,間接修改指針指向的變量。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-836938.html
#include<stdio.h>
void changeValue(int **ptr)
{
int newValue = 10;
*ptr = &newValue; // 修改二級(jí)指針指向的變量
}
int main()
{
int value = 5;
int *ptr = &value;
changeValue(&ptr); // 傳遞二級(jí)指針作為參數(shù)
printf("%d", *ptr); // 輸出修改后的值
return 0;
}
- 輸出結(jié)果:
六、指針數(shù)組
指針數(shù)組是一個(gè)數(shù)組,其中的每個(gè)元素都是指針。通過(guò)指針數(shù)組,可以存儲(chǔ)多個(gè)指針,并進(jìn)行相應(yīng)的操作。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-836938.html
#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é)果:
到了這里,關(guān)于深入理解指針(c語(yǔ)言)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!