我好懵,所以来理理概念
文章目录
一.指针
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);//释放动态内存
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语言:定义指向二维数组的指针变量
后面还有关于函数与指针的,不打算放在这里,也不打算最近就研究。