ポインタとは
わかりやすく言うと、次
の図に示すように、ポインタを使用して変数のアドレスを格納します。
(エディターはvc2010です)
#include<stdio.h>
void main(){
int a,*p;
a=5;
p=&a;
printf("a=%d,p=%p,*p=",a,p,*p);
getchar();
}
そのため、今の状況では、ポインタを介して変数の値を取得できるだけでなく、変数の値を直接変更できることがわかりました。
別の例は次のとおりです。
#include<stdio.h>
void main(){
int a=3;
int* prt;
prt=&a;
printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);
getchar();
}
配列ポインタ
ポインタと言えば、基本的なint char floatの意味は何ですか、次は配列とポインタを
組み合わせる配列ポインタです。もちろん、配列自体は渡されるときにポインタによって渡されます。
以下はコードのデモンストレーションです。
#include<stdio.h>
void main(){
int a [5]={
1,2,3,4,5},*p,i;
p = a;
for(i=0;i<5;i++){
printf("&a[%d]=%p,a[%d]=%d\n",i,p,i,p[i]);
}
getchar();
}
p = a(配列aへのポインタ)の場合、ポインタpはポインタの配列である配列aのように操作できることがわかりました。
配列ポインタ
ポインタ配列について説明しているので、配列ポインタについて説明する必要があります。2つの名前は一見非常に似ていますが、実際にはまだギャップが非常に大きいです
。Int* p []
以下は上記の例を例として取り上げており、出力結果の一貫性を保ちます。
#include<stdio.h>
void main(){
int a [5]={
1,2,3,4,5},*p[5],i;
for(i=0;i<5;i++){
p[i]=&a[i];
}
for(i=0;i<5;i++){
printf("&a[%d]=%p,a[%d]=%d\n",i,p[i],i,*p[i]);
}
getchar();
}
これは実際にはストレージアドレスの配列であることがわかりました。このメモリアドレスは、int charまたはfloatのいずれかであり、配列でもあります。これについては、文字列配列について説明した後で説明します。
文字列配列
C言語には文字列クラス(java)もstr(python)もありません。文字しかないため、文字列を格納するための文字列配列を導入しました。
( 'a'1バイト "a" 2バイト)
ここでは注意が必要です。つまり、char a [5] = "hello"のような文字列配列は、表面には5文字しかありませんが、実際には、メモリ分布の最後(「o」の後ろ)に文字があります。 \ 0 'は終了を意味するため、char a [5]のみがhelloに適合できません、char a [6] = "hello"。したがって、 "a"は' a '+' \ 0 '(' \ 0 'は表示されません)
#include<stdio.h>
void main()
{
char a[6]={
'h','e','l','l','o'};
//char a[6] ="hello";也行
printf("%s",a);
getchar();
}
さらに、「hello」を直接書き込むことも文字列の配列であることに注意してください。ただし、名前は付けられていません。ポインタを使用してアクセスできます。
#include<stdio.h>
void main()
{
char *p="hello";
printf("%s\n",p); //%s 会读取第一个字符的地址知道读到'\0'
printf("%c",p[1]);//输出字母e
getchar();
}
アレイポインタのSao操作
最初にコードの一部を見てください
#include<stdio.h>
void main(){
char *p[3]={
"hello",
"my",
"friend"
};
printf("%s",p[1]);
getchar();
}
これで、p [1]は文字ポインタのように操作できることがわかりました。つまり、p [1]はと
同等です。
char a [4] = "my"、* c;
c = a;
ここで、cはp [1]と同等です。
#include<stdio.h>
void main(){
char *p[3]={
"hello",
"my",
"friend"
};
int i;
for(i=0;i<2;i++)
{
printf("%c\n",p[1][i]);
}
getchar();
}
二次ポインタ
この男はマトリオシュカです、ただ写真を見て理解してください
関数ポインタ
int(* p)(int x)intが
指す関数タイプ
(* p)ポインター名
(int x)が指す関数に入力する必要のあるパラメーター
これは、
たとえば関数です
#include<stdio.h>
void main(){
int go(int x);
int x,(*p)(int x);
scanf("%d",&x);
p=go;//指针指向函数
//(*p)(x)也行
p(x);
getchar();
getchar();
}
int go(int x)
{
printf("you input number is:%d",x);
}
このようなものの利点は何ですか?このようなものを使用すると、別の関数を別の関数に直接渡すことができます。
アップグレードの例
#include<stdio.h>
void main(){
int go(int x),x;
void show(int x, int(*p)(int x));
scanf("%d",&x);
show(x,go);
getchar();
getchar();
}
int go(int x)
{
printf("you input number is:%d",x);
}
void show(int x, int(*p)(int x)){
printf("you have inputed!\n");
p(x);
}
ポインター機能
率直に言って、これは次のようなアドレスを返す関数です。
int* go (int* x,int* y)
*は()よりも操作レベルが低いため、関数ポインターのように見えます。
たとえば、関数ポインターは()を追加します。
#include<stdio.h>
void main(){
int *go(int *x);
int a=5,*p;
p=go(&a);
printf("a的地址为:%p,值为:%d",p,*p);
getchar();
}
int *go(int *x){
printf("地址以获取\n");
return x;
}
ファイルポインタ
これは興味深いことです。C言語はすべてのデバイスをポインタとして扱います
。FILE* fp = NULL;
fp = fopen( "file path"、 "w")( "w"はオープンモード、wは書き込まれます)
fprintf(fb、使用「%s」は、STR)これは同じものであり、単にポインタの前にプリントが示し
言い換えるの
キーボードポインタ標準入力のprintf(「こんにちは)とfprintfの(STDOUT、」ハロー「)のような、標準出力スクリーンポインタ、
共感を
fputs( "hello"、fp)
次に、ファイルを読み取ります
char s [100]
fp = fopen( "file path"、 "r")
fscanf(fp、 "%s"、s)
fgets(s、100、fp)(100は最大長です)
違いはfprintf()はスペースまたはキャリッジリターンを読み取って戻り、fgets()はキャリッジリターンを読み取って戻ります。
さらに、fread()
fread(受信データアドレス、読み取ったバイト数、データアイテム数、ファイルポインタ)
他のマニュアルも良いです。
最後に、
fclose(fp)を閉じることを忘れないでください