C言語学習ノート(はじめに3)(ポインター)

ポインタとは

これは、ポインタの力を説明するための例です。

#include<stdio.h>
void main(){
    
    
	const int a=3;
	//这里定义一个const int 变量a 其作用就是锁定a的值使之不可变.
	//比如此时再让a=4就会报错
	a=4;

}

ここに写真の説明を挿入
このとき、aの値を強制的に変更したい場合は、ポインタを使用する必要があります。

#include<stdio.h>
void main(){
    
    
	const int a=3;
	int* prt;//创建一个指向int的指针
	//这里定义一个const int 变量a 其作用就是锁定a的值使之不可变.
	//比如此时再让a=4就会报错
	prt=&a;//取地址
	*prt=4;//提取所储存地址内的对应的值并修改为4
	printf("a=%d",a);

}

結果は次のとおりです。
ここに写真の説明を挿入

メモリ図

理解を深めるために、次のデモンストレーション図を描くことができます。
ここに写真の説明を挿入
例を見てみましょう。

#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);

}

ここに写真の説明を挿入

ポインタータイプ

これについては何も言うことはありません。いくつかのデータ構造があり、複数のポインターが存在する可能性があります。ポインターは、特定の変数のアドレスを指す単なるツールです。これの利点は、新しい変数を作成せずにスコープを設定できることです。変数が存在し、メモリスペースが破壊されていない場合、の影響は変数を直接変更するか、値を取ります。

int a ----> int * aprt
float b -----> float * b
char c -------> char * c
int arr [100] -----> int * arrprt [100 ] //数組

ポインターサイズ

どのポインタが格納され、本質的に、比較のために添加し、減算することができる値である進メモリアドレスである。
それを説明する前に、単に整数配列の概念を導入する。
整数配列の
アレイは単に使用することです率直に言って、データのセットを格納するものはリストです。C言語の整数リストに格納されている整数がすべて整数であるというだけです。

#include<stdio.h>
void main(){
    
    
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i;
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	
}

アレイの場合、そのメモリ分布は次のとおりです。
ここに写真の説明を挿入

したがって、配列の値を表示したい場合は、これを行うことができます

#include<stdio.h>
void main(){
    
    
	int* x;
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i,j;
	x=&list;
	printf("list的内存地址%p,list的第一个元素的地址%p",x,listprt[0]);
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	for(j=0;j<5;j++){
    
    
		printf("list[i]=%d",*listprt[i]);
	}
	
	
}

このようにすることもできます

	
#include<stdio.h>
void main(){
    
    
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i,j;
	
	
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	printf("%p,%p\n",&list,listprt[0]);//补充前面说的
	for(j=0;j<5;j++){
    
    
		printf("list[i]=%d\n",*(listprt[0]+j));
	}

}

ここでのポインタプラス1またはマイナス1は、複数のメモリユニットを減算することを意味します。上記の例では、intが2バイトを占有し、pがポインタであると仮定します。次に、pが0x11111であり、p ++がp + 2バイトであり、結果が0x11113であるとします。同様に、2を追加します。つまり、p + = 2で、pは0x11115です。

二次ポインタ

率直に言って、それは入れ子の人形です。
以下のコードの一部を見てください。

void main(){
    
    
	int a=4;
	int* p=&a;
	int**mp=&p;//二级指针,三级指针就是 int*** 
	printf("a=%d\np的地址为:%p\np指向的值为:%d,mp的地址是:%p,指向的是%p\na的地址是%p",a,&p,*p,&mp,*mp,&a);
}

結果は次のとおりです。
ここに写真の説明を挿入
メモリ概略図は次のとおりです。
ここに写真の説明を挿入
したがって、この図と組み合わせると、3レベルと4ポインターは同じになります。無限の人形。
さらに、ポインターは関数、つまり関数ポインターを指すこともできます。
これについては次のセクションで説明します。

おすすめ

転載: blog.csdn.net/FUTEROX/article/details/109476733