十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
目錄
1.指針與數(shù)組
1.1一維數(shù)組:
//利用指針訪問一維數(shù)組
1.2二維數(shù)組:
//用指針模擬一個3行4列的數(shù)組
// 利用二維數(shù)組的行地址和列地址訪問二維數(shù)組
1.3數(shù)組指針
//利用數(shù)組指針訪問二維數(shù)組?
2.指針和字符串
//利用字符指針復(fù)制字符串
//利用字符指針反轉(zhuǎn)字符串
3.指針數(shù)組
//利用字符指針數(shù)組將五門課程名按字典順序排序輸出
1.1一維數(shù)組:區(qū)別:指針和數(shù)組是不同的對象。指針是一種變量,用來存放地址,大小固定,為4個或8個;數(shù)組是一組相同類型元素的結(jié)合,是可以放多個元素的,大小是取決于元素個數(shù)和元素類型的;
聯(lián)系:數(shù)組的數(shù)組名 arr 是數(shù)組起始元素的地址(注意不要和數(shù)組的首地址 &arr 混淆),地址是可以放在指針變量中的,可以通過指針訪問數(shù)組。
這里先拓展一下指針與一維數(shù)組的關(guān)系:
//利用指針訪問一維數(shù)組已知 int arr [ 10 ]? ; int *? p = arr ;
則 arr [ i ]? = p [ i ] =? * ( p + i ) = * ( arr + i )?;
這些完全等價,但是技多不壓身嘛,多會幾種總是好的。
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
int* p = arr;//起始p指向arr中第一個元素,即首地址
for (i = 0; i< 10; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
來看看一維指針數(shù)組是啥樣的(這里涉及到了指針數(shù)組的概念,在老下面會講到)~
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = 50;
int* arr[5] = { &a,&b,&c,&d,&e };
int i = 0;
for (i = 0; i< 5; i++)
{
printf("%d ", *(arr[i]));
}
return 0;
}
二維數(shù)組名是二級指針常量(行指針)。
設(shè)有 arr [3][5] = {"1234","5678","ABCD"}; 則:
arr [ i ] + 0 | arr [ i ] + 1 | arr [ i ] + 2 | arr [ i ] + 3 | arr [ i ] + 4 | |
arr + 0 | arr [0][0] | arr [0][1] | arr [0][2] | arr [0][3] | arr [0][4] |
arr + 1 | arr [1][0] | arr [1][1] | arr [1][2] | arr [1][3] | arr [1][4] |
arr + 2 | arr [2][0] | arr [2][1] | arr [2][2] | arr [2][3] | arr [2][4] |
//用指針模擬一個3行4列的數(shù)組行:地址:arr + i = &arr [i]
?元素:arr [i] = *(arr + i)
列:地址:arr [i] + j = *(arr + i) + j
?元素:arr [i][j] = *(*(arr + i) + j) = *(arr [i] + j) = (*(arr + i)) [j]?
int main()
{
int a[] = { 1,2,3,4 };
int b[] = { 2,3,4,5 };
int c[] = { 3,4,5,6 };
int* arr[3] = { a,b,c };
int i = 0;
for (i = 0; i< 3; i++)
{
int j = 0;
for (j = 0; j< 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
// 利用二維數(shù)組的行地址和列地址訪問二維數(shù)組#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
int arr[3][3];
int i = 0, j = 0;
printf("請輸入數(shù)組:\n");
for (i = 0; i< 3; i++)
{
for (j = 0; j< 3; j++)
{
scanf("%d", *(arr + i) + j);//這里是地址不是元素?。?!
}
}
printf("打印的數(shù)組為:\n");
for (i = 0; i< 3; i++)
{
for (j = 0; j< 3; j++)
{
printf("%d ", *(*(arr + i) + j));//這里是元素不是地址?。?!
}
printf("\n");
}
return 0;
}
1.3數(shù)組指針C語言允許定義一個指向一維數(shù)組的指針變量——行指針變量,又稱數(shù)組指針。
格式:type(*數(shù)組指針變量名)[一維數(shù)組長度]
例如:int(*ptr)[ 3 ] 定義了一個指向3個連續(xù)存放的整型數(shù)的內(nèi)存首地址的數(shù)組指針。
//利用數(shù)組指針訪問二維數(shù)組?二維數(shù)組中 arr + 1 和 arr [1] 的區(qū)別:
1>arr +1 是一個行指針(二級指針),指向內(nèi)存中連續(xù)5個數(shù)據(jù) arr [1][0],arr [1][1],arr [1][2],arr [1][3],arr [1][4];
2>arr [1] 是一個列指針(一級指針),arr [1] = *(arr?+ 1)= &arr [1][0]。?
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int i = 0, j = 0;
int(*p)[3] = arr;//指向arr數(shù)組的第一行的3個元素, 此時p相當(dāng)于 &(arr+0)——行指針(二級)
for (i = 0; i< 3; i++, p++) //注意不是&arr[0]=arr[0][0]——列指針(一級)
{
for (j = 0; j< 3; j++)
{
printf("%d", (*p)[j]);//p相當(dāng)于&(arr+i),*p相當(dāng)于 arr+i 即 arr[i]
}
printf("\n");//換行后 p++,指向第二行的3個元素
} //……
return 0;
}
一級字符型指針定義方法:char* 一級字符指針變量名;
一開始指向的是字符串在內(nèi)存中的起始地址,后續(xù)使用時還可能指向其他地方。
例如:char* str1 = "C program";
?char string[] = "China";
?char* str2 = string;
//利用字符指針復(fù)制字符串字符指針變量 str 與字符數(shù)組 string 的區(qū)別:
1>存儲內(nèi)容不同:str 是地址變量,string 是地址常量,都指向 &string[0],但str可變;
2>存儲空間長度不同:字符數(shù)組長度確定,尾部空間可能閑置,而字符指針變量占用字節(jié)數(shù)是地址所需長度,與字符串長度無關(guān);
3>賦值方式不同:字符數(shù)組定義時可直接初始化,也可利用strcpy賦值,但不能直接賦值,而字符指針變量既可以定義時初始化,也可以稍后直接賦值;
4>接受輸入不同:字符數(shù)組可以直接接受輸入,字符指針變量接受輸入的字符串之前要事先指向一段內(nèi)存存儲空間,否則會變成野指針;
5>運算不同:字符數(shù)組名是地址常量,不能改變指向,字符指針變量可以參加指針運算,改變指向。
int main()
{
char arr1[20];
char arr2[20];
printf("請輸入一個字符串:");
gets(arr1);
char* p1 = arr1;
char* p2 = arr2;
while (*p1)
{
*(p2) = *(p1);
p2++;
p1++;
}
*p2 = '\0';//最后放個字符串結(jié)束符,否則會出現(xiàn)亂碼
printf("復(fù)制后的字符串為:");
puts(arr2);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
char arr[20];
printf("請輸入一串字符串:");
gets(arr);
char* begin = arr;
char* end = arr;
while (*end)//知道找到最后一個元素的地址
{
end++;
}
end--;
int tmp = 0;
while (begin< end)//指針比較
{
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
printf("翻轉(zhuǎn)后的字符串為:");
puts(arr);
return 0;
}
//利用字符指針數(shù)組將五門課程名按字典順序排序輸出結(jié)構(gòu):char* 指針數(shù)組名 [ 數(shù)組長度 ] ;
指針數(shù)組與二維數(shù)組的區(qū)別:
指針數(shù)組中的每一個元素所指向的一維數(shù)組長度可以不同,一維數(shù)組之間也不需要在內(nèi)存中連續(xù)存放;指針數(shù)組中的每一個元素均為指針變量,地址可變;數(shù)組指針是一個二級指針變量;指針數(shù)組名與二維數(shù)組名一樣,是一個二級指針常量。
#define _CRT_SECURE_NO_WARNINGS
#include#includeint main()
{
char* arr[5] = { "C/C++","Python","MATLAB","Authorware","Java" };
int i = 0, j = 0;
printf("原始順序為:\n");
for (i = 0; i< 5; i++)
{
puts(arr[i]);
}
char* tmp = 0;
for (i = 0; i< 4; i++)
{
for (j = 0; j< 4 - i; j++)
{
if (strcmp(arr[j], arr[j + 1]) >0)
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
printf("按字典順序排序后為:\n");
for (i = 0; i< 5; i++)
{
puts(arr[i]);
}
return 0;
}
指針初階暫時告一段落了,內(nèi)容還是很多的,一定要吃透?。m然對我來說有點小難度,唉……),遞歸和指針是初階C語言的半壁江山啊,加油加油,淺淺期待一下指針進階叭~~~
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧