c博客作业05--指针

| 这个作业属于哪个班级 | 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\n",p1==f1);
    printf("p2>p1:%d\n",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\n",*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\n", 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的长度,字符串的长度不包括字符'\0'

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说反话-加强版

代码截图:


posted @ 2020-12-27 21:00  SONGminusone  阅读(52)  评论(0编辑  收藏  举报