这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业05--指针 |
这个作业的目标 | 学习指针相关内容 |
姓名 | 黄抒鸿 |
0.展示PTA总分
1.本章学习总结
1.1指针定义、指针相关运算、指针做函数参数
1.1.1 指针的定义:
指针就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。
//类型 *变量标识符;
int *p;
//其中:p是一个指向整型变量的指针变量
//定义普通变量
float a = 99.5, b = 10.6;
char c = '@', d = '#';
//定义指针变量
float *p1 = &a;
char *p2 = &c;
//修改指针变量的值
p1 = &b;
p2 = &d;
使用指针变量之前一定要初始化,对于暂时没有指向的指针,建议赋值NULL。
1.1.2 指针的相关运算
·指针能进行算术运算,包括:+,-,++,--,+=,-=。
·指针的关系运算:
1)指针变量保存的地址值比较
#include <stdio.h>
void main
{
float fl[6];
float *p = f1,*p2 = &f1[2];
printf("p1==f1:%d
",p1==f1);
printf("p2>p1:%d
",p2>p1);
}
2)指针变量所指向的变量值的关系运算
#include <stdio.h>
void main
{
int a[]={1,2,3,4,5,6,7,8};
int *p,*q;
q = a;
q = &a[3];
printf("*p == *q:%d
",*p==*q);
}
两个指针变量可以相减。如果两个指针变量指向同一个数组中的某个元素,那么相减的结果就是两个指针之间相差的元素个数。
1.1.3 指针做函数参数
用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。
#include <stdio.h>
void swap(int *p1, int *p2){
int temp; //临时变量
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main(){
int a = 66, b = 99;
swap(&a, &b);
printf("a = %d, b = %d
", a, b);
return 0;
}
运行结果:
a = 99, b = 66
调用 swap() 函数时,将变量 a、b 的地址分别赋值给 p1、p2,这样 p1、p2 代表的就是变量 a、b 本身,交换 p1、p2 的值也就是交换 a、b 的值。函数运行结束后虽然会将 p1、p2 销毁,但它对外部 a、b 造成的影响是“持久化”的,不会随着函数的结束而“恢复原样”。
1.2字符指针
·字符指针初始化
char *str = "Welcome";
或
char a[] ="Welcome";
char *str;
str = a;
·字符串操作函数
strcpy(str1,str2):将字符串str2复制到字符串str1中,并覆盖str1原始字符串,可以用来为字符串变量赋值
strcmp(str1,str2);比较两个字符串,如果两个字符串相等,则返回0;若str1大于str2,返回一个正数(这个正数不一定是1);若str1小于str2,返回一个负数(不一定是-1)
strcat(str1,str2):将字符串str2添加到字符串str1的尾部,也就是拼接两个字符串
strlen(str1):计算字符串str1的长度,字符串的长度不包括字符' '
1.3指针做函数返回值
·C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。
·函数返回值必须用同类型的变量。
·用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据
1.4动态内存分配
相关函数用法
1.malloc()函数
函数声明:
void *malloc(size_t size)
malloc分配的内存大小至少为size参数所指定的字节数
malloc的返回值是一个指针,指向一段可用内存的起始地址
多次调用malloc所分配的地址不能有重叠部分,除非某次malloc所分配的地址被释放掉
malloc应该尽快完成内存分配并返回,该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。
实现malloc时应同时实现内存大小调整和内存释放函数(realloc和free)
2.calloc()函数:
函数声明:
void * calloc (size_t num, size_t size);
作用:用来动态地分配内存空间并初始化为 0
calloc() 与 malloc() 的一个重要区别是:calloc() 在动态分配完内存后,自动初始化该内存空间为零,而 malloc() 不初始化,里边数据是未知的垃圾数据。
3.free()函数:
函数声明:
void free(void *ptr)
作用:free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。
1.5指针数组及其应用
指针数组:里面的元素全部都是指针。
char *p[]={"China","America","Russia","Australia"};
//这四个指针变量保存了4个字符串的起始位置的地址。
多个字符串用二维数组表示和用指针数组表示区别?
我们可以借助指针来访问二维数组,虽然相比使用数组形式访问繁琐点,但通过这个过程可以让我们对二维数组的构成更加清晰明了。
在字符串数组的初始化上显然更建议用指针数组来进行初始化,这样能更好地利用内存空间。
但在访问字符串数组(或者其他二维数组)上,用数组形式更加简洁、清晰。
1.6二级指针
指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。如果一个指针指向的是另外一个指针,我们就称它为二级指针,即指向指针的指针。
假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:
即:
int a =100;
int *p1 = &a;
int **p2 = &p1;
1.7行指针、列指针
行指针:指的是一整行,不指向具体元素。
列指针:指的是一行中某个具体元素。
//示例1:用列指针输出二维数组。
#include <stdio.h>
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p= a[0]; // 列指针的定义法
for(; p < a[0] + 12; p++)
{
printf("%d ",*p);
}
return;
}
//示例2:用行指针输出整个二维数组。
#include <stdio.h>
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4]= &a[0]; // 行指针定义法
int i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
{
printf("%d ",*(*(p + i) + j));
}
return;
}
2.PTA实验作业
2.17-3 字符串的冒泡排序
代码截图:
2.2合并2个有序数组
2.3说反话-加强版
代码截图: