一维数组名称
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void printArray(int arr[],int len)//int arr[]等价于int *arr
{
for (int i = 0; i < len; i++)
{
printf("%d\n",arr[i]);//给人看
//printf("%d\n",*(arr+i)); //给机器看的
}
}
void test01(){
int arr[5] = {1,2,3,4,5};
//一维数组名称 是不是指针
printf("sizeof arr=%d\n",sizeof(arr));
//除了两种特殊情况,一维数组名称都是指针 指向数组中首元素的地址
//特殊情况1 对数组名称 进行sizeof
//特殊情况2 对数组名称 取地址
int *p = &arr;
printf("%d\n",&arr);
printf("%d\n",&arr+1);
//数组名称 指针常量 指针的指向不可以修改 int * const p
/* *arr = NULL;
arr[0] = 100;
printf("%d\n",arr[0]);*/
int len = sizeof(arr) / sizeof(int);
printArray(arr,len);
int *p1 = arr;
p1 = p1 + 3;
printf("%d\n",*p1);
//[]里面可以放负数
printf("%d %d\n",*(p1-1),p1[-1]);
}
int main(){
test01();
return 0;
}
数组指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//先定义出数组的类型,再通过类型创建数组指针
void test01(){
int arr[5] = { 1, 2, 3, 4, 5 };
typedef int(ARRAY_TYPE)[5]; // ARRAY_TYPE是一个数据类型,代表有5个int类型元素的数组
ARRAY_TYPE *arrP = &arr;
//printf("%d\n",arrP); //**60
//printf("%d\n", arrP+1); //**80
// *arrP等价与 arr
for (int i = 0; i < 5; i++)
{
printf("%d\n", (*arrP)[i]);
}
}
//先定义数组指针的类型,再创建数组指针变量
void test02(){
int arr[5] = { 1, 2, 3, 4, 5 };
typedef int(*ARRAY_TYPE)[5];
ARRAY_TYPE arrP = &arr;
}
void print(int(*p)[4], int row){
for (int i = 0; i < row; i++)
{
for (int j = 0; j < sizeof(*p) / sizeof(int); j++){
printf("%3d",*(*(p+i)+j));
//printf("%3d ",p[i][j]);
}
printf("\n");
}
}
//直接创建数组指针变量
void test03(){
int arr[5] = { 1, 2, 3, 4, 5 };
int(*pArr)[5] = &arr; //pArr就是数组指针,指向长度为5的一维整型数组, sizeof(pArr)为4
//int *q[4]; 指针数组
int a[3][4] = {1,3,5,7,2,4,6,8,9,11,13,17};
int b[4] = {1,2,3,4};
int i, j;
int(*p)[4];
p = a;
print(p,3);
}
int main(){
test03();
return 0;
}
二维数组名称
#include <stdio.h>
#include <stdlib.h>
void test01(){
//可读性高
int arr[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
//int arr2[3][3] = {1,2,3,4,5,6,7,8,9};
//int arr3[][3] = {1,2,3,4,5,6,7,8,9};
int(*p)[3] = arr; //二维数组名称 指向第一个一维数组
//特殊情况
printf("sizeof arr=%d\n",sizeof(arr)); //36 统计二维数组长度
int(*p2)[3][3] = &arr; //对数组名取地址
//访问二维数组中的六
printf("%d\n",arr[1][2]); //给人看
printf("%d\n",*(*(arr+1)+2)); //给机器看
}
//二维数组做函数参数
//void printArray(int p[][3],int row,int col)
void printArray(int p[3][3], int row, int col)
//void printArray(int (*p)[3],int row,int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d", *(*(p + i) + j));
}
printf("\n");
}
}
void test02(){
int arr[3][3] =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
printArray(arr,3,3);
}
int main()
{
test02();
system("pause");
}
指针数组的排序
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void selectSort01(int arr[],int len){
for (int i = 0; i < len; i++)
{
int min = i; //定义最小值的的下标
for (int j = i+1; j < len; j++)
{
if (arr[min]>arr[j])
{
//更新真实最小值下标
min = j;
}
}
if (min!=i)
{
//交换数据
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}
void printArray(int arr[],int len){
for (int i = 0; i < len; i++)
{
printf("%d\n",arr[i]);
}
}
void test01(){
int arr[] = {10,2,5,1,7,4};
int len = sizeof(arr) / sizeof(int);
selectSort01(arr,len);
printArray(arr,len);
}
//通过选择排序算法计算后,实现对指针数据的降序排序 从大到小
void selectSort(char **pArr,int len){
for (int i = 0; i < len; i++)
{
int max = i;//认定最大值下标为i
for (int j = i+1; j < len; j++)
{
if (strcmp(pArr[max],pArr[j])==-1)
{
//更新最大值下标
max = j;
}
}
if (i!=max)
{
char *temp = pArr[max];
pArr[max] = pArr[i];
pArr[i] = temp;
}
}
}
void printCharArray(char **pArr,int len){
for (int i = 0; i < len; i++)
{
printf("%s\n",pArr[i]);
}
}
void test02(){
char *pArr[] = {"aaa","bbb","fff","ddd","eee","ccc"};
int len = sizeof(pArr) / sizeof(char *);
selectSort(pArr,len);
printCharArray(pArr,len);
}
int main()
{
test02();
system("pause");
}