指针与数组

我好懵,所以来理理概念

一.指针

1.指针是什么?

指针是变量,存放内存地址

2.指针的作用:

-较之其他方法通常可以生成更高效、紧凑的代码 ;
-模拟传引用调用(可得到多个函数返回值);
-操作动态数据结构;

3.指针变量的声明和初始化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.指针的运算

在这里插入图片描述在这里插入图片描述

5.利用指针实现传引用调用

传引用调用:实参是个变量,对形参的修改其实就是对实参的修改
在这里插入图片描述

6.额外知识——关于运算符sizeof

在这里插入图片描述

二.指针与数组

1.指针与数组的关系

数组是一种用于存储的数据结构,数组名是数组的首地址,而指针存放地址,便可通过地址将两者建立关系,用指针变量操作数组。

2.数组元素的地址详解

(1).数组名为第0个元素的地址;
(2).数组下标小的元素对应的内存地址的十六进制代码小
(3)越晚定义分配的地址越小
在这里插入图片描述

3.数组元素地址与指针比较的关系(指针的关系运算)

指针指向同一数组,则可根据指针大小判断元素前后顺序;若不在同一数组,比较只能得出定义的先后顺序,无意义。
在这里插入图片描述

4.指针的算术运算

在这里插入图片描述
运算后的地址计算方法
在这里插入图片描述

5.指针访问数组元素的方式

在这里插入图片描述

6.指针与数组的异同

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.举例字符数组与指针

在这里插入图片描述

三.动态数组

(通过指针申请)

1.如何创建

(1).一维数组的创建

在这里插入图片描述
在这里插入图片描述
(2).二维数组的创建

提示:malloc与free的使用,以下代码即建立了一个n行m列的整型二维动态数组,并释放:
int **a,n ,m;
scanf(%d%d”,&n,&m);
a=(int **)malloc(sizeof(int *)*n);//建立长度为n的动态指针数组
for(i=0;i<n;i++)
a[i]=(int *)malloc(sizeof(int)*m);//建立长度为m的一维整型数组
for(i=0;i<n;i++)
free(a[i]);
free(a);//释放动态内存

【c语言】动态开辟一个二维数组

2.再论指针的赋值运算:指向void类型的指针

在这里插入图片描述在这里插入图片描述

3.访问动态数组(与普通数组无差别)

4.释放动态数组占用的储存空间与回收指针

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
申请动态数组一定要知道成不成功
在这里插入图片描述

四.指针数组

1.定义

在这里插入图片描述

2.程序举例

#include<stdio.h>
#include<stdlib.h>
main()
{
   int n,len,i;
   char * * ptr;

   printf("请输入字符串个数:");
   scanf("%d",&n);
   printf("请输入字符串最大长度:");
   scanf("%d",&len);
   getchar();//读取回车符,否则系统会认为输入的第一个串会是空串 
	//动态申请指针数组
   ptr = malloc(sizeof(char *) * n);
   if (ptr == NULL)
      printf("指针数组内存分配失败");
   else{
      for(i = 0; i <= n-1; i++){
         ptr[i] = malloc(sizeof(char) * (len+1));//又给指针变量申请动态数组
         if ( ptr[i]==NULL)
            printf("第%d个字符串内存分配失败",i+1);
         else {                     
            printf("请输入第%d个字符串:\n",i+1);             
            gets(ptr[i]); //读取字符串 
         	} 
         }
      printf("输入的字符串是:\n");
      for(i = 0; i <= n-1; i++)
         puts(ptr[i]); 
      
      //内存释放
      for(i = 0; i <= n-1; i++)//先释放字符串的内存,再释放指针数组
           free(ptr[i]);
      free(ptr);
      ptr = NULL;      
   } 
   
   system("pause");
   return 0;
} 

先释放字符串的内存,再释放指针数组

3.问题举例

在这里插入图片描述

五.多维数组指针

1.二维数组元素指针法

在这里插入图片描述
对于数组名来说,假设 zippo[4][2]
在这里插入图片描述

2.一些理解

看作4个数组,一个数组有两个元素,可以使用pz+i来进行每行首元素的地址访问,相当于告诉机器,一次加法运算跳过几个元素。
一定要加上括号,因为[]的优先级高于*
在这里插入图片描述
在这里插入图片描述
一些多维数组指针的参考:
C语言定义指向多维数组的指针
C语言:定义指向二维数组的指针变量

后面还有关于函数与指针的,不打算放在这里,也不打算最近就研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值