數組指針是一個指向數組的指針,而指針數組是一個存儲指針的數組。
?數組指針?:是一個指針,指向一個數組的首地址,它用于指向整個數組,而不是數組中的某個元素。例如,int (*p)表示 p 是一個指向包含 5 個整數的數組的指針。??數組指針?聲明時使用括號明確優先級,如 int (*p)[10],其中()的優先級高于[ ],因此p首先被定義為一個指針,然后指向一個大小為10的數組。
?指針數組?:是一個數組,其元素都是指針,它用于存儲多個指針,每個指針可以指向不同的數據。例如,int *p 表示 p 是一個包含 5 個整型指針的數組。??指針數組?聲明時 [ ] 優先級高于 *,如 int *p[10],表示 p 首先被定義為一個數組,然后數組的元素是指針類型。
內存占有:
?數組指針?:在 32 位系統中,數組指針占 4 字節,指向的數組大小由數組本身決定。
?指針數組?:數組的大小由元素數量和指針大小決定。例如,int *p 在 32 位系統中占 20 字節(5 個指針,每個 4 字節)。
使用場景?:
?數組指針?:常用于傳遞數組的首地址,避免復制整個數組,適合處理二維數組的行指針。
?指針數組?:用于存儲多個指針,適合動態分配內存或管理多個對象的指針。?
操作方式?:
?數組指針?:通過解引用訪問數組元素,如 *(*p + i) 訪問第 i 個元素。
?指針數組?:通過數組索引訪問指針,如 *p[i] 訪問第 i 個指針指向的值。
優先級與結合性?:
?數組指針?:() 優先級高于 [ ],因此 int (*p) 明確表示 p 是指針。
?指針數組?:[ ] 優先級高于 *,因此 int *p 明確表示 p 是數組。
---------------------------------------------------------------------------------------------------------------------------------
一、
在以下的代碼中,struct student - 是一個類型,而Stu - 是這個類型所創建的變量
struct student
{int num;char name[32];float score;
}Stu;
//Stu - 是結構體變量int main()
{return 0;
}
而如果在此類型的前面加上 typedef ,就可以創建新的類型,例如以下的代碼,Stu是新的類型,可以用這個類型創建新的變量s1
typedef struct student
{int num;char name[32];float score;
}Stu;
//Stu - 是類型int main()
{Stu s1;return 0;
}
二、喝汽水
一瓶汽水1元,2個空瓶可以換一瓶汽水,給20元,可以喝多少汽水
int main()
{int money = 0;int total = 0;int empty = 0;scanf("%d",&money);//20total += money;//買empty = money;//置換while(empty >= 2){total += empty / 2;empty = empty / 2 + empty % 2;}printf("%d\n",total);return 0;
}
還有更高效的方式:
int main()
{int money = 0;int total = 0;scanf("%d",&money);//20if(money > 0)total = 2 * money - 1;printf("%d\n",total);return 0;
}
三、上三角矩陣判斷
上三角矩陣即主對角線以下的元素都為0的矩陣,主對角線為從矩陣的左上角至右下角的連線
輸入:第一行包含一個整數n,表示一個方陣包含n行n列,用空格分隔。從2到n+1行,每行輸入n個整數,用空格分隔,共輸入n*n個數。
輸出:一行,如果輸入方陣是上三角矩陣輸出"YES"并換行,否則輸出“NO"并換行。
示例:
3
1 2 3
0 4 5
0 0 6
YES2
2 3
4 5
NO
int main()
{int n = 0;scanf("%d",&n);//int arr[n][n];//C99 變長數組int arr[10][10];//輸入int i = 0;for(i = 0;i < n; i++){int j = 0;for(j = 0;j < n; j++){scanf("%d",&arr[i][j]);}}//判斷return 0;
}
接下來的部分是如何判斷:
在主對角線以下的部分,我們可以發現 i > j,主對角線上 i = j,主對角線以上的部分,i < j
那么我們就可以這樣寫:
int main()
{int n = 0;scanf("%d",&n);//int arr[n][n];//C99 變長數組int arr[10][10];//輸入int i = 0;for(i = 0;i < n; i++){int j = 0;for(j = 0;j < n; j++){scanf("%d",&arr[i][j]);}}//判斷int flag = 1;//默認是上三角矩陣for(i = 0;i < n; i++){int j = 0;for(j =0;j < i; j++){if(arr[i][j] != 0){flag = 0;goto end;}}}
end:if(flag == 1)printf("YES\n");elseprintf("NO\n");return 0;
}
四、矩陣相等判斷
有兩個n行m列的矩陣,想知道兩個矩陣是否相等。(當兩個矩陣對應數組元素都相等時兩個矩陣相等)。
輸入:兩個n行m列的矩陣
輸出:如果兩個矩陣相等輸出"Yes"并換行,否則輸出"No“并換行。
int main()
{int n = 0;int m = 0;scanf("%d %d",&n,&m);int arr1[n][m];int arr2[n][m];//C99 變成數組//輸入數據//第一個數組int i = 0;int j = 0;for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr1[i][j]);}}//第二個數組for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr2[i][j]);}}//比較int flag = 1;//默認2個矩陣相等for(i = 0;i < n; i++){for(j = 0;j < m; j++){if(arr1[i][j] != arr2[i][j]){flag = 0;goto end;}}}
end:if(flag == 1)printf("YES\n");elseprintf("NO\n");return 0;
}
另一種方法:第二個數組每輸入一個就與第一個數組判斷
int main()
{int n = 0;int m = 0;scanf("%d %d",&n,&m);//int arr1[n][m];//int arr2[n][m];//C99 變成數組int arr1[100][100];int arr2[100][100];//輸入數據//第一個數組int i = 0;int j = 0;for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr1[i][j]);}}//第二個數組int flag = 1;//默認2個矩陣相等for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr2[i][j]);if(arr1[i][j] != arr2[i][j]){flag = 0;goto end;}}}
end:if(flag == 1)printf("YES\n");elseprintf("NO\n");return 0;
}
五、調整奇數偶數順序
輸入一個數組,實現一個函數,來調整該數組中數字的順序使得數組中所有的奇數位于偶數的前面,即位于數組的前半部分
void move(int arr[],int sz)
{int left = 0;int right = sz - 1;while(left < right){//找偶數的過程while(left < right && arr[left] % 2 ==1){left++;}//找奇數while(left < right && arr[right] % 2 == 0){right--;}if(left < right){int tmp = 0;arr[left] = arr[right];arr[right] = tmp;left++;right--;}}
}
int main()
{int arr[10] = {0};int sz = sizeof(arr) / sizeof(arr[0]);//輸入int i = 0;for(i = 0;i < sz, i++){scanf("%d",&arr[i]);}//調整move(arr,sz);//輸出for(i = 0;i < sz; i++){printf("%d ",arr[i]);}return 0;
}
六、有序序列合并
輸入兩個升序排序的序列,將兩個序列合并為一個有序序列并輸出
輸入:兩個整數n、m,表示升序序列中數據的個數
輸出:輸出長度為n+m的升序序列,即長度為n的升序序列和長度為m的升序序列中的元素重新進行升序序列排列并合并
示例:
輸入:5 61 3 7 9 222 8 10 17 33 44
輸出:1 2 3 7 8 9 10 17 22 33 44
int main()
{int n = 0;int m = 0;//輸入scanf("%d %d",&n,&m);int arr1[n];//1000int arr2[m];//1000int arr3[n+m];//2000//arr1的輸入int i = 0;for(i = 0;i < n; i++){scanf("%d",&arr1[i]);}//arr2的輸入for(i = 0;i < m; i++){scanf("%d",&arr2[i]);}i = 0;int j = 0;int k = 0;while(i < n && j < m){if(arr1[i] < arr2[j]){arr3[k] = arr1[i];i++;k++;}else //如果是大于等于走這條代碼{arr3[k] = arr2[j];j++;k++;}}if(i == n)//數組arr1中元素比arr2少{//把arr2中剩余的元素放在arr3中while(j < m){arr3[k] = arr2[j];j++;k++;}}else //比arr2多(j == m){//把arr1中剩余的元素放在arr3中while(i < n){arr3[k] = arr1[i];i++;k++;}}//輸出for(k = 0;k < n+m; k++){printf("%d ",arr3[k]);}return 0;
}
或者還可以這樣(投巧):
int main()
{int n = 0;int m = 0;//輸入scanf("%d %d",&n,&m);int arr1[n];//1000int arr2[m];//1000int arr3[n+m];//2000//arr1的輸入int i = 0;for(i = 0;i < n; i++){scanf("%d",&arr1[i]);}//arr2的輸入for(i = 0;i < m; i++){scanf("%d",&arr2[i]);}i = 0;int j = 0;int k = 0;while(i < n && j < m){if(arr1[i] < arr2[j]){printf("%d ",arr1[i]);i++;}else {printf("%d ",arr2[j]);j++;}}if(i == n){//把arr2中剩余的元素放在arr3中while(j < m){printf("%d ",arr2[j]);j++;}}else {//把arr1中剩余的元素放在arr3中while(i < n){printf("%d ",arr1[i]);i++;}}return 0;
}
七、有序序列判斷
輸入一個整數序列,判斷是否是有序序列,有序,指序列中的整數從小到大排序或者從大到小排序(相同元素也視為有序)
輸入:第一行輸入一個整數N;第二行輸入N個整數
輸出:如果是有序序列輸出sorted,否則輸出unsorted
示例1:
輸入:51 6 9 22 30
輸出:sorted
示例2:
輸入:53 4 7 2 10
輸出:unsorted
示例3:
輸入:51 1 1 1 1
輸出:sorted
int main()
{int n = 0;scanf("%d",&n);int arr[n];int i = 0;for(i = 0;i < n; i++){scanf("%d",&arr[i]);}int flag1 = 0;//標記升序int flag2 = 0;//標記降序for(i = 1;i < n; i++){if(arr[i-1] < arr[i]){flag1 = 1;}else{flag2 = 1;}}if(flag1 + flag2 == 2){printf("unsorted\n");}else{printf("sorted\n");}retrun 0;
}
或者:
int main()
{int n = 0;scanf("%d",&n);int arr[n];int i = 0;int flag1 = 0;//標記升序int flag2 = 0;//標記降序for(i = 0;i < n; i++){scanf("%d",&arr[i]);if(i > 0){if(arr[i-1] < arr[i]){flag1 = 1;}else{flag2 = 1;}}}if(flag1 + flag2 == 2){printf("unsorted\n");}else{printf("sorted\n");}retrun 0;
}