1.指针数组和数组指针
1.1 数组指针
定义:指向数组的指针
格式:类型 (*指针名)[每行元素个数];
含义:相当于定义了一个指针,可以代替数组
使用方式:
int* pd;
pd = arr;//指向第一行
(*pd)[0] = 4;//将数组arr下标为0 0的元素赋值为4
pd[1][2] = 9;//将数组arr下标为1 2的元素赋值为9
1.2 指针数组
定义:同时使用多个指针,则为指针数组
格式:类型* 数组名[数组大小];
给指针数组申请内存:
for (int i = 0; i < 10; ++i)
{
pArr[i] = (int*)malloc(sizeof(int) * 4);
}
2.指针常量和常量指针
关键字:常量-const
特点:通过const限定的变量,变量值不可变,但是与指针搭配时需要说明
const与指针搭配方式1: 常量指针
格式:
类型 const *变量名 或 const 类型 *变量名
说明:
常量指针可以重新赋新地址
常量指针不可以重新赋值
const与指针搭配方式2: 指针常量:
格式:
类型* const 变量名=地址;
说明:
指针常量不能被重新赋地址
指针常量可以修改指向的内容
3.指针函数和函数指针
指针函数:返回值为指针的函数
函数指针:用于函数传参 指向函数的指针
4.说明
字符串赋值必须用strcpy
[]的优先级高于*的优先级
指针数组都是二维数组
常量指针实际就是const修饰的常量,而指针常量具有了限定指针地址的作用
函数调用过程
函数名—>函数 传递形参 计算 得到返回值—>回到主函数
5.代码实例
#include<stdio.h>
#include<iostream>
/*查找行最小 列最大的元素 找到之后直接打印*/
void fun1(int arr[][4], int row)//二维数组传参需要传递行
{
int m, n;
for (int i = 0; i < row; ++i)
{
//查找一次的过程
m = 0;
for (int j = 0; j < 4; ++j)
{
if (arr[i][j] < arr[i][m])//m表示这一行最小的元素
{
m = j;
}
}
//arr[i][m]是这一行的最小值
for (n = 0; n < row; ++n)
{
if (arr[n][m] > arr[i][m])break;
}
if (n == row)
{
printf("所求的点(行最小,列最大)是[%d,%d]\n\n", i, m);
}
}
}//作业----用来判断鞍点
//数组指针说明
void test()
{
int arr[3][4] =
{
9,7,4,5,
7,7,3,2,
1,0,2,9,
};
//行最小 列最大---->找到每一行的最小值 用循环一个个的比较,然后判断是不是这列的最大值
fun1(arr, 3);
//下文用于说明数组指针的定义、赋值
printf("\n此处用于说明数组指针的使用方式");
printf("\n数组arr的原始内容为:\n");
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 4; ++j)
{
printf("%-4d", arr[i][j]);
}
printf("\n");
}
int(*pd)[4];//指向一行的内容 指向数组的指针 数组指针
pd = arr;//指向第一行
(*pd)[0] = 4;//将数组arr下标为0 0的元素赋值为4
pd[1][2] = 9;//将数组arr下标为1 2的元素赋值为9
printf("\n用数组指针进行赋值操作后,数组arr的内容为\n");
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 4; ++j)
{
printf("%-4d", arr[i][j]);
}
printf("\n");
}
}
//指针数组说明
void test1()
{
int* pArr[10];//指针数组 10个int*
for (int i = 0; i < 10; ++i)
{
pArr[i] = (int*)malloc(sizeof(int) * 4);
}//指针数组都是二维数组
}
//指针常量和常量指针
void test2()
{
int const x=10;//通过语法限定 x的值不可变 必须先定义然后赋值,不可被重新赋值存放在栈区
int arr[10];
const int *p;//与int const *p 同含义 //const限定变量不能修改所指向的内容 //常量指针
p = &arr[0];//说明常量指针的指向可以改变 //*p = 0; 相当于arr[0]赋值为0 说明常量指针不可以被赋值
int* const q=&arr[0];
//q = &arr[0]; 说明指针常量不能被赋地址
*q = 0;//说明可以用指针q修改指向的内容
}
//指针函数和函数指针
void test3()
{
//void * malloc(size_t _Size);
void * (*pfun)(size_t _Size);
pfun = malloc;
int *p = (int*)pfun(100 * sizeof(int));
}
int main()
{
int arr[3][4];
printf("arr[0](表示数组arr的行的大小)的大小%d\n\n", sizeof(arr[0]));//没法表示一列元素的大小
test();
test2();
system("pause");
return 0;
}