cポインタの浅い分析
2143 ワード
一.ポインタの定義
c言語ではポインタは変数の前に「*」を付けて表され、ポインタはメモリアドレスにすぎず、特別な点はありません.
定義:int*pvなど;整数のメモリアドレスを格納する整形ポインタ変数を定義します.
付与値:int num;pv=# 変数numのメモリアドレスをpvに割り当てる.
アクセス変数の値:2つの方法で、1つ目は変数名numを直接使用してnumの値を使用します.これを直接アクセスと言います.第2の使用
ポインタ*pvはnumの値を取得するために間接アクセスと呼ばれます.(ここでpvはnumのアドレス値、*pvはnumの値)
補足:値で を渡す.
関数を呼び出すと、変数値をパラメータとして関数に渡すことを値別伝達と呼びます.値によって渡されるのは変数のコピー、キューのコピーの変更です.
関数の内部に限り、元の値は変わりません.参照伝達 関数を呼び出すと、変数メモリアドレスを関数に渡すことを参照による伝達と呼びます.この方法では、元のデータの変更は永続的に有効であり、
関数以外の他のコードで感知できます.
二.配列とポインタ:(ポインタの増減はすべてイントラブロック単位)
1.なぜ配列はポインタで処理できるのか
まず,配列名は配列ヘッダ要素の開始アドレスを表すことを明らかにしなければならない.これは配列自体の特性であり,配列名をポインタとして扱うことができる.
int array[100]; int *pv;
pv=array;またはpv=&array[0];ポインタpvで配列ヘッダアドレスを格納する.
2.ポインタを使用して配列内の任意の要素を参照します.
*array=*(array+0)=array[0];
*(array+1)=array[1];
では、任意に*(array+i)と書くことができます.
*pvは配列の最初の値を表し、*pv++を使用して配列の次の値にアクセスします.
3.2 D配列とポインタ(1 D配列と類似)
array[0][0]=*(*(array+0)+0);
array[0][1]=*(*(array+0)+1);
array[1][0]=*(*(array+1)+0);
array[i][j]=*(*(array+i)+j);
pv=array;
*pvは配列の最初の値を表し、*pv++を使用して配列の次の値にアクセスします.このことから,2次元配列は特殊な1次元配列であることが分かる.
三.ポインタ配列
1.存在する意味(どのような問題を解決するか)
複数の文字、文字列、配列に動的メモリを割り当てます.
補足:動的メモリの問題については、「動的メモリと静的メモリの概要」を参照してください.
たとえば、動的メモリを20文字列に割り当て、各メモリに20バイトを格納します.
char *name[20];
name[i]=(char *)malloc(20);//ヘッダファイル#includeの追加
四.関数のポインタパラメータ
以前に関数に渡されたパラメータは、文字か数値か、文字列の操作はまだ渡されていません.では、関数のポインタパラメータが解決されます.
渡されるパラメータは文字列の問題です.パラメータを文字ポインタタイプとして定義するだけです.
void function(char *str)
五.ポインタ戻り値
関数が数値と文字を返すのを見たことがありますが、関数が配列を返す文字列はどうすればいいのでしょうか.針で返す
定義関数はint*function()です.またはchar*funtion(char*str);
関数には文字列の値が返され、渡されたパラメータも文字列のインスタンスです.
c言語ではポインタは変数の前に「*」を付けて表され、ポインタはメモリアドレスにすぎず、特別な点はありません.
定義:int*pvなど;整数のメモリアドレスを格納する整形ポインタ変数を定義します.
付与値:int num;pv=# 変数numのメモリアドレスをpvに割り当てる.
アクセス変数の値:2つの方法で、1つ目は変数名numを直接使用してnumの値を使用します.これを直接アクセスと言います.第2の使用
ポインタ*pvはnumの値を取得するために間接アクセスと呼ばれます.(ここでpvはnumのアドレス値、*pvはnumの値)
補足:
関数を呼び出すと、変数値をパラメータとして関数に渡すことを値別伝達と呼びます.値によって渡されるのは変数のコピー、キューのコピーの変更です.
関数の内部に限り、元の値は変わりません.
関数以外の他のコードで感知できます.
二.配列とポインタ:(ポインタの増減はすべてイントラブロック単位)
1.なぜ配列はポインタで処理できるのか
まず,配列名は配列ヘッダ要素の開始アドレスを表すことを明らかにしなければならない.これは配列自体の特性であり,配列名をポインタとして扱うことができる.
int array[100]; int *pv;
pv=array;またはpv=&array[0];ポインタpvで配列ヘッダアドレスを格納する.
2.ポインタを使用して配列内の任意の要素を参照します.
*array=*(array+0)=array[0];
*(array+1)=array[1];
では、任意に*(array+i)と書くことができます.
*pvは配列の最初の値を表し、*pv++を使用して配列の次の値にアクセスします.
3.2 D配列とポインタ(1 D配列と類似)
array[0][0]=*(*(array+0)+0);
array[0][1]=*(*(array+0)+1);
array[1][0]=*(*(array+1)+0);
array[i][j]=*(*(array+i)+j);
pv=array;
*pvは配列の最初の値を表し、*pv++を使用して配列の次の値にアクセスします.このことから,2次元配列は特殊な1次元配列であることが分かる.
三.ポインタ配列
1.存在する意味(どのような問題を解決するか)
複数の文字、文字列、配列に動的メモリを割り当てます.
補足:動的メモリの問題については、「動的メモリと静的メモリの概要」を参照してください.
たとえば、動的メモリを20文字列に割り当て、各メモリに20バイトを格納します.
char *name[20];
name[i]=(char *)malloc(20);//ヘッダファイル#includeの追加
四.関数のポインタパラメータ
以前に関数に渡されたパラメータは、文字か数値か、文字列の操作はまだ渡されていません.では、関数のポインタパラメータが解決されます.
渡されるパラメータは文字列の問題です.パラメータを文字ポインタタイプとして定義するだけです.
void function(char *str)
五.ポインタ戻り値
関数が数値と文字を返すのを見たことがありますが、関数が配列を返す文字列はどうすればいいのでしょうか.針で返す
定義関数はint*function()です.またはchar*funtion(char*str);
関数には文字列の値が返され、渡されたパラメータも文字列のインスタンスです.
#include
#include
#include
char * function(char *name){
char *s= "hello" ;
strcat(s,name);//
return s;
}
int main(){
char * n;
n=(char *)malloc(sizeof(int));//
printf(" ") ;
gets(n);
printf("%s
",function(n));
puts(function(n));
return 0;
}