指针3_数组-指针

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;
 }

猜你喜欢

转载自blog.csdn.net/weixin_41743247/article/details/88779005