这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业05--指针 |
这个作业的目标 | 学习指针相关内容 |
姓名 | 陈泽役 |
目录
0.展示PTA总分
1.本章学习总结
1.1 指针定义、指针相关运算、指针做函数参数。
- 定义:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
- 指针运算:指针变量加/减一个整数(如p++)、指针变量赋值(如p=&a)
指针变量相减:如果两个 指针变量指向同一个 数组的元素,则两个指针变量之差是两个指针之间的元素个数。注意, 指针变量相加无实际意义。
指针变量比较:如果两个指针变量指向同一个数组的元素,则可以进行比较。指向前面元素的 指针变量小于指向后面元素的指针变量。
1.2 字符指针
- 定义:指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。
1.3 指针做函数返回值
- 指针做函数返回值时:应该返回的是地址。
#include<stdio.h>
int* func()
{
int n = 100;
return &n;
}
int main()
{
int* p = func();
printf("value = %d
", *p);
return 0;
}
1.4 动态内存分配
- 在c/c++语言中,编写程序有时不能确定数组应该定义为多大,因此这时在程序运行时要根据需要从系统中动态多地获得内存空间。所谓动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
- malloc 函数
其函数原型为:void *malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。 - free 函数
函数原型为:void free(void*p);
其作用是释放指针 p 所指向的动态空间,使这部分空间能被其他变量使用。p 是最近一次调用 calloc 或malloc 函数时的返回值。free函数无返回值。
1.5 指针数组及其应用
- 指针数组就是每个数据元素都是一个指针的数组,每个数据元素中存储一个指针,他们的基类型必须相同。
- 利用指针数组可以有两个目的:(1)可以实现各维度上长度可变的类似多维数组的数据存储,灵活多变,利用数据的实际需求来申请内存;(2)数据共享,防止数据的多个副本。
#include<stdio.h>
void inv(int *x,int n);
int main ( )
{int i ,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:
");
for (i=0;i<10;i++) printf("%3d",a[i]);
printf("
");
inv(a,10);
printf("The array has been inverted:
");
for (i=0;i<10;i++) printf("%3d",a[i]);
printf("
");
return 0;
}
void inv(int* x, int n)
{
int i,j=0;
int b[10];
for (i=0;i<10;i++)
{
b[i] = *(x + i);
}
for (i = 9; i >= 0; i--)
{
*(x + (j++)) = b[i];
}
}
1.6 二级指针
- A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据B的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
1.7 行指针、列指针
- 行指针
| 写法 | 解释 | 指针类型 |
| :--------: | :----------------------------------: | :------: |
| a+0或&a[0] | 指向第1个一维数组的地址(指向第1行) | 行指针 |
| a+1或&a[1] | 指向第2个一维数组的地址(指向第2行) | 行指针 |
| a+2或&a[2] | 指向第3个一维数组的地址(指向第3行) | 行指针 |
行指针是指向数组的指针,即上面几种指针类型中的 int (*a)[5]; - 列指针
| 写法 | 解释 | 指针类型 |
| :--------------: | :------------------: | :------: |
| a[0]+0或&a[0][0] | 指向第1行第1列的地址 | 列指针 |
| a[0]+1或&a[0][1] | 指向第1行第2列的地址 | 列指针 |
| a[1]+0或&a[1][0] | 指向第2行第1列的地址 | 列指针 |
| a[1]+1或&a[1][1] | 指向第2行第2列的地址 | 列指针 |
像上面的a[row]+col即列指针,列指针经过一次解引用就可以转化成二维数组中实际的值,列指针也是指向非常量的常量指针。
2.PTA实验作业
2.1 字符串反正序连接
2.1.1 伪代码
定义两个数组s和t;
通过循环计算s数组的长度
然后再通过循环依次逆序存放,顺序存放
最后t数组加上结束标志' '
2.1.2 代码截图
#include <stdio.h>
void fun (char *s, char *t);
int main()
{ char s[100], t[100];
scanf("%s", s);
fun(s, t);
printf("%s
", t);
return 0;
}
void fun(char* s, char* t)
{
int i = 0, j, length;
while (s[i] != ' ')
{
t[i] = s[i];
length = i;
j = i;
i++;
}
for (i = 0; i <= 2*length+1; i++)
{
if(i<=length)
{
t[i] = s[j];
if (j > 0)
{
j--;
}
}
else
{
t[i] = s[j];
j++;
}
}
t[i] = ' ';
}
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
2.2 合并2个有序数组
代码还未成功,存在问题
2.3 说反话-加强版
2.3.1 伪代码
定义数组str;
len用来存储字符串长度;
从后往前进行,记录单词最后一个字母的位置
如果不是输出第一个单词,即原字符串最后一个单词,要输出一个相隔的空格
从该单词的开头字符逐个输出到末尾字符
2.3.2 代码截图
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char str[500010];
int len,real,head,count=0;
int i,j,k;
gets(str);
len=strlen(str);
for(i=len-1;i>=0;i--)
{
if(str[i]!=' ')
{
real=i;
for(j=i-1;j>=0;j--)
{
if(str[j]==' ')
{
break;
}
}
head=j+1;
if(count>0)
{
printf(" ");
}
for(k=head; k<=real; k++)
{
printf("%c", str[k]);
}
count++;
i=j;
}
}
return 0;
}