07-01-指针与数组
1 动态创建二维数组
int rows, cols;
printf("请输入二维数组行数:");
scanf(" %d", &rows);
printf("请输入二维数组中列数:");
scanf(" %d", &cols);//外层二维数组----二维指针
int** arr= (int**)malloc(rows * sizeof(int*)); //int*占8个字节
for (int i = 0;i < rows;i++) {
//动态创建一个指针----一维数组
arr[i] = (int*)malloc(cols * sizeof(int));
for (int j = 0;j < rows;j++) {
arr[i][j] = j + 10;
printf("%d ", arr[i][j]);
}
printf("\n");
}
free(arr);
2 指针与数组专题
int a = 10;
int* p = &a;
int** p1 = &p;//二级指针
printf("%d ", **p1);//取二级指针的值
//1.一维数组和指针
int arr[3] = { 10,20,30 };
//数组名是地址,相当于第一个元素的地址,数组名也是个常量,一但初始化完成,数据不能改变
int* ptr=NULL;//指针变量,可以对ptr赋值
ptr = arr; //ptr=&arr[0];//2.使用指针来访问数组 步长:数据类型的长度 ptr+1每次从首元素开始,ptr++每次以当前元素开始
//取元素20
printf("%d %d %d %d ", arr[1], *(arr + 1), *(ptr + 1), ptr[1]);//20 20 20 20//取元素20
ptr++;
printf("%d %d ", *ptr, ptr[0]);//20 20//获取数组的最大值
int arr[3] = { 10,20,30 };
//方法一 假设第一项为最大值
int max = arr[0];
for (int i = 0;i < 3;i++) {
if (max < arr[i]) {
max = arr[i];
}
}
printf("max=%d ", max); //max = 30//方法二 使用指针
int* p = arr;
int max1 = *p;
for (int i = 0;i < 3;i++) {
if (max1 < *(p + i)) {
max1 = *(p+i);
}
}
printf("max1=%d ", max1); //max1 = 30
3 指针带下标的使用
int a[5] = { 10,20,30,40,50 };
int* p = a;
for (int i = 0;i < 5;i++){
printf("%d ", p[i]);
}
for (int i = 0;i < 5;i++) {
printf("%d ", p[0]);//p指向谁,谁是起点 例:当前p 指向a[3],则p[2]并不代表a[2],而是 a[3+2],即 a[5]
p++;
}
printf("%p %p ", a, &a);// 000000CAF1F9F698 000000CAF1F9F698
printf("%p %p %p ",a, a + 1,&a + 1);//不是同一个地址 000000CAF1F9F698 000000CAF1F9F69C 000000CAF1F9F6AC
4 指针和数组
4.1普通指针
int a = 10;
int* ptr = &a;int arr[5] = { 10,20,30 };
int* ptr1 = arr;
4.2 数组指针 定义方式:数据类型(*ptr)[size] 优先级:( )>[ ]> *
int arr[10] = { 10,20,30 };
int(*ptr)[10] = &arr;//ptr是一个指向包含10个整数的数组的指针
int matrix[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} }; // 声明一个3x4的二维数组
int arr[10] = { 10,20,30 };
int(*ptr)[4] = matrix; //ptr是一个指向包含4个整数的数组的指针,这个数组本身是一个二维数组的行//数组方法 访问第一行第二列的元素
printf("%d ", matrix[0][1]); //2
//指针方法 访问第一行第二列的元素
printf("%d ", (*ptr)[1]); //2//数组方法 访问第二行第一列的元素
printf("%d ", matrix[1][0]);//5
//指针方法 访问第二行第一列的元素
printf("%d ", (*(ptr+1))[0]);//5//数组方法 访问第三行第三列的元素
printf("%d ", matrix[2][2]);//11
//指针方法 访问第二行第一列的元素
ptr++;
ptr++;
printf("%d ", (*ptr )[2]);//11
4.2.1遍历
for (int i = 0; i < 3; i++) { // 遍历行
for (int j = 0; j < 4; j++) { // 遍历列
printf("%d ", (*ptr)[j]);// printf("%d ", matrix[i][j]);
}
printf("\n"); //1 2 3 4
//5 6 7 8
//9 10 11 12
ptr++; // 移动到下一行
}
4.3 指针数组
int* arr[10];//arr是数组名 它里面的元素是指针
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = { &a,&b,&c };
for (int i = 0;i < 3; i++) {
printf("%d ", *arr[i]);
}int line1[] = { 1,2,3,4 };// 矩阵第一行
int line2[] = {5,6,7,8};
int line3[] = {9,10,11,12};
int* ptr[3] = {line1,line2,line3};for (int i = 0;i < 3;i++) {
for (int j = 0;j < 4;j++) {
printf("%d ", ptr[i][j]);
}
}
数组指针vs指针数组
(1)数组指针一定是指针
int(*ptr)[10]; //ptr是指针变量 指针变量指向的是包含十个元素的一维数组 应用场景:二维或多维
(2)指针数组一定是数组 数组中的元素是指针
int* arr[10];//arr是数组名,里面的元素是指针