0表示PTAスコア(0 ---- 2)
1.この章では、研究をまとめたもの
ポインタ変数を定義します。1.
- 一般的な形式:タイプ名*ポインタ変数名
- タイプは、例えば、可変の尖ったポインタ変数の型の名前です。
int *p;/*定义一个指针变量p,指向整型变量*/
- ポインタ変数を定義するにはポインタ文シンボルであり
*
、*オペレータがない場合、それは、ポインタの処理を行うことが望まれるように、定義されているポインタ変数を表し、フロントテープする必要はありません*
。 - ポインタ変数の複数の定義変数は、各ポインタの前に添加されるべきです
*
。
ポインタの2.基本的な操作
- 2.1アドレス演算子
- オペレータとは、例えば、変数のアドレスを与える
int *p,a=3; p=&a;
変数は、プラスチック、ポインタPを成形するのアドレスを割り当てる、pは変数へのポインタポイントは、pはアドレスの値です。 - 関数のscanf&アドレスオペレータは、例えば、ある:
scanf("%d",&a);
操作変数、外出先への入力変数の格納された値のアドレスを取得することです。
- オペレータとは、例えば、変数のアドレスを与える
- 2.2間接アクセス演算子
*
ポインタ宣言子に加えて、値の変数へのポインタポイントにアクセスし、間接アクセス演算子として使用することができます。例えば、int *p,a=3; p=&a; printf("%d",*p);
出力が3である場合、時刻A、P、 P、および同細胞への訪問は、* p値が値aです。
- 2.3混在運転
*
発現に優先度と優先順位の同じ増分減少が、結合方向は、右から左にあり、pは++と同等である式p ++を見つけ、次に取る、(P ++)*(P ++)値。- ポインタ型の間で同じことをしないの追加!
- 変数iのポインタpプラス(又はマイナス)iは整数可能である、タイプ(またはフロント)の後部アクセス。
- ポインタの同じタイプの間で減算を行う際に、その値を意味し、int型の値を生成するのメモリ位置への2つのポインタ間の間隔を置いて配置されているどのように多くの要素を示している音符の要素ではなく、バイト数である計算では、配列ポインタが頻繁に使用される、値位置を見つけるために使用することができます。
- 2.4割り当て
- ポインタ変数の割り当ては、最初にして、この時点に特に注意して、使用します!。例えば、
int *a; scanf("%d",a);
最初にその初期値の空に設定されることができるポインタを定義する際に生じる参照ポインタ割り当てに避け害するために、それは、プログラムエラーの使用上のポインタの所定の初期値に対して行われていない、使用することができませんポインタ変数の初期値として値。 - Pポインタ割り当て
p=0;
とp=NULL
0がASCII文字NULLの値であり、発現ポインタpがNULLポインタは、任意の細胞を指していない、ヌルポインタです。
- ポインタ変数の割り当ては、最初にして、この時点に特に注意して、使用します!。例えば、
3.ポインタと配列
配列とポインタ間の3.1の関係
int *p;
int a[10];
p=a;
- その章では、配列の配列名は、最初のアドレスである連続したメモリアドレス空間、割り当ての最初のユニットの機能ことを示して学びました。配列の最初の要素に対してここでPポインタポイント。
- ポインタPがポインタを一定とみなすことができる配列a、操作ではなく、からのものであってもよい、定数が減少の増加を行うことができません。
3.2ポインタループ変数練習
配列へのポインタポイント場合、ループ変数は、例えば、アレイを横断するポインタを用いて行うことができます。
/*在字符数组a中查找字符ch*/
定义字符指针p;
定义字符ch;
定义字符数组a[10];
定义变量pos保存查找到的ch的位置,初始化为-1
输入字符ch;
p=a;//使指针指向数组第一个元素;
for p to p指向a数组a的最后一个元素
if(*p==ch)
pos=p-a;
end if
end for
if pos<0
说明没有找到,输出没有找到语句;
else
说明找到,输出位置;
結果:
4文字列のポインタを表し
- 文字列定数は、本質的に、文字列定数の最初の文字へのポインタである文字列の最初の文字に、受信されたポインタの文字列定数の値ならば、このポインタは、
- 出力文字列のフォーマット%が連続的に、たとえば、これまでのところ、それが遭遇するまで、「\ 0」、指定された内容のセルの開始アドレスから出力さsのprintfの関数呼び出し、:
- プラスまたはマイナスの整数ポインタI、例えば、i番目の文字または文字の前に、i番目の点のアドレスに現在のポインタポイントを表します。
一般的な文字列操作関数
ヘッダファイルします。#include <string.hの>
6.動的なメモリ割り当て
- スタック領域(スタック)から6.1アロケーション
- 関数のパラメータを格納し、ローカル変数
- 関数呼び出しでは、ローカル変数と関数内のスタック上に割り当てられたシステムパラメータメモリは、自動的に機能実行メモリの終了時に解放します。
- ヒープ(ヒープ)領域から割り当て6.2
- プログラムの実行中に、アプリケーションのメモリから動的メモリ割り当て機能は、ヒープ、プログラマの動的寿命メモリ上に確保されています。
- 動的なメモリ割り当て関数
7.ポインタ配列及びその応用
- 7.1コンセプト
- 一般的な形式:
类型名 *数组名 [数组长度]
- 指针数组中的每个元素都是指针类型,用于存放内存地址。
- 一般的な形式:
- 7.2指针数组保存字符串
- 数组中的每个元素保存的是字符串的首地址,每个元素分别指向一个字符串
2.PTA实验作业
2.1查找子串(函数题)
2.1.1 伪代码
/*函数search在字符串s中查找子串t,返回子串t在s中的首地址,若未找到,则返回NULL*/
定义变量i从字符串s中找到t的第一个字符开始遍历字符串s和字符串t;
while (*s)
初始化i为0;
while (*(s+i)==*(t+i)&&*(s+i)!='\0'&&*(t+i)!='\0') //这里从字符串s中找到t的第一个字符开始,对i进行自增处理,保留当前s的地址,不断遍历字符串s和字符串t,直到不相等或者遍历到字符串s和t的结束标志;
i++;
end while
if 遍历到字符串t的结束标志'\0'
表示找到字符串t,直接返回s的地址;
end if
s++; //字符串s往下一个字符移动;
end while
程序运行到最后,还没结束,说明没有找到字符串t,返回NULL;
2.1.2 代码截图
2.1.3 总结本题的知识点
- 设计返回指针类型的函数
pos=search(s,t);
- 利用两个指针相减来求出位置
printf("%d\n", pos - s);
2.1.4 PTA提交列表及说明
编译错误:return s 语句后面忘记加分号
2.2说反话-加强版
2.2.1 伪代码
/*在函数ReverseStr中,将字符串中的每个单词倒序输出*/
定义字符指针endPtr用来寻找字符串的最后一个字符,首先对endptr赋初值为beginPtr
定义字符指针p;
定义变量len来保存单词长度;
定义变量flag来判断是否为要输出的第一个单词,对其赋初值为1;
while(*endPtr!='\n'&&*endPtr) //逆向扫描到最后一个字符
endPtr++;
end while
p=--endPtr; //使p指向最后一个非结束符的字符;
while(p!=beginPtr) //当p指向短剑的首地址时结束循环
若*p不是空格,则统计单词长度;len++
若*p不是空格,但前一个是空格,则找到单词
根据flag的值判断是否为第一个要输出的单词,输出从p开始的len长度字符串;
len=0;重新开始找单词;
p--
end while
如果第一个字符(*beginPtr)不是空格的话,要考虑到短句中第一个单词的输出。
2.2.2 代码截图
2.2.3 总结本题的知识点
- 如何查找单词
即当前字符非空格而前一个字符为空格; - 逆向扫描字符
while(p!=beginPtr) {p--}
- 字符串指针表示字符串
printf("%.s",len,str);
2.2.4 PTA提交列表及说明
部分正确:短句中第一个单词前面没有空格时,第一个单词不会输出;
部分正确:短句中第一个单词的输出有问题,长度判断错误导致第一个单词的最后一个字符无法输出;
部分正确:最长句子,字符数组的长度应该为500002以上。
2.3删除字符串中的子串
2.3.1 伪代码
/*在函数DeleteB中删除子串*/
定义指针ptra指向a的首地址,后边对ptra进行操作;
定义字符数组c来保存字符串中出现的子串后面的字符;
定义指针locPtr来表示出现子串的位置;
定义lenB来保存子串B的长度;
while(loPtr=strstr(a,b)!=NULL)
ptra=locPtr;
ptra='\0';//因为在使用strcat函数时,被连接的字符串结尾应该要有结束标志'\0'
strcpy(c,ptra+lenB); //用字符数组c来保存后面的字符;
strcat(ptra,c); //将子串删去,连接除去子串后的剩下的字符;
end while
输出字符串a
2.3.2 代码截图
2.3.3 总结本题的知识点
- 掌握字符串处理函数
strstr函数可以帮找到子串,熟练掌握字符串处理函数可以帮助我们省略很多代码; - 这里也要区分输入函数,gets函数和fgets函数,用fgets函数吸收字符串时,如果长度小于可输入的最大长度,字符串结尾会带换行符,在使用字符串处理函数时要把换行符去掉;
2.3.4 PTA提交列表及说明
部分错误:最长字符串错误,数组长度没有设置好;
多种错误:格式错误,最后输出语句换行了,没有处理好换行符;
编译错误:pta中不承认gets_s函数,我从vs复制过来时忘记改了;
部分错误:自己定义了一个找子串的函数,然后运行超时。
部分错误:不熟悉字符串处理函数,在找到子串的位置应该加上'\0',否则在进行函数连接时会出错;
3.阅读代码
代码优点
- 1.运用了dict