C言語のポインタと配列要約

関連する質問とポインタ式1

1. 変数のアドレスは誰だった人に、アドレスポイントに対処する必要があります

そして、関連する問題は、描画へのポインタ:変数の家の絵の内容を、ポインタの矢印を描きます

---->口

-------------------------------------------------- -

二つの特別な演算子と関連するポインタ:

「&」アドレス演算子は、共通の変数&オペレータによってアドレスを取得することができます。

第二に、「*」は、2つの意味があります。

   1.ポインタフラグ:ポインタフラグINTがメインタイプのフロントかどうかを確認するかどうか

   2.ポインタ演算子:

     等号の右辺の値があります。*共通の変数の値は可変点ポインタとることができます。

     等号の左側が割り当てられます。*別に変更し、通常の変数ポインタ変数が指す値であってもよいです。

        2式 *コンテンツの価値、読み取りが書くことではありませんがあります。等号の左側には、残りの値に対しては、割り当てです。

   図3は、乗算演算子です。場合にのみ、左と右のは可変です。わずか。

として

、B = 20、C = 30、D = 40、* P int型(正常、*ポインタフラグを、わずか約本明細書で定義され、一次ポインタフラグかどうかを確認するために割り当てられた役割を評価しないプレー。タイプはフロントがあり、フロントは)ここではint型を持っています

P =&D(右、DのアドレスにP点)

A = * pが、(右、*最終結果値の値である場合は、40 Dの値となります。)

* P = C(。*値は、dの値の最終結果は、30 Cでなる修正、割り当て)

* P =&B;(ランエラー、コンテンツの左値、右のアドレス、非等価)

-------------------------------------------------- ------

同等の表現に関連するとポインタ

変数aへのポインタ変数pポイント場合、アドレスは、変数、ポインタ変数pに割り当てられます。

如:int型、A = 20、int型* p =&;

そして、次の結果:

、* P <=>

B、P <=>&A

C、&* P <=>&<=> P

D、*&<=>の* P <=>

そして、(P *)は++ ++ 

     (* P) - A--    

     ++(* P)++ ++ * P   

      - (* P)--a - * P

*これは、見ているとの往復2つの演算子することができます

-------------------------------------------------- ------

メモリに割り当てられたすべてのポインタ変数バイトのsizeofの同じ数(ポインタ)にかかわらず、ポインタがINT *、フロート*または二重*定義されている場合の、常に2バイトである。以下でより詳細

int型* P1;それはint型のP1変数の後にポイントする必要があります。しかし、2バイトのポインタ自体はsizeof(P1)、(2 * 8ビット-16bit)の長さ

フロート* p2と、その後p2はfloat型変数を指していなければなりません。しかし、2バイトのポインタ自体はsizeof(P2)(2 * 8ビット-16bit)の長さ

ダブル* p3に、それはdouble型のP3の変数の後にポイントする必要があります。しかし、2バイトのポインタ自体はsizeof(P3)(2 * 8ビット-16bit)の長さ

-------------------------------------------------- ---------

4つの例:

例1。

ボイド楽しい(INT * X、int型*のY){
  のprintf( "%dを、%のD"、* X、* Y);
  * X = 3。
  * yが4 =。
}

メイン()
{
int型、X = 1、Y 2 =
楽しい(&Y、およびX)を、
printf( "%dを、%のD"、x、y)は、
}


結果
2 1
4 3

関数を呼び出すとき、メイン楽しさを注意yとxは、意図的に逆さまに書かれました。

 -------------------------------------------------- ------------

例2。 

する#include <stdio.hの>
ボイドスワップ(INT * P1、int型*のP2)
{
int型温度;
一時= * P1;
* P1 = * p2の。
* P2 =温度;
}

メイン()
{
int型、B。
int型* P1 =&、* P2 =&B;
scanf関数(%D%D、P1、P2)。
スワップ(P1、P2)。
prinf( "%のDは、%D"、* P1、P2 *)。
}

コンソールを入力した場合は  2と5

出力は、 

5、2

原因:タイトルP1への変更、内部スワップ機能で参照p2の値コンテンツはaとbの外の値に影響を与えますので、スワップ機能を呼び出します。

 -------------------------------------------------- ------------

例3:

する#include <stdio.hの>
ボイドスワップ(INT * P1、int型*のP2)
{
int型*の一時。
温度= P1;
P1 = P2;
P2 =温度;
}

メイン()
{
int型、B。
int型* P1 =&、* P2 =&B;
scanf関数(%D%D、P1、P2)。
スワップ(P1、P2)。
prinf( "%のDは、%D"、* P1、P2 *)。
}

異なる2、5、P2 = TEMP 5かかる点P2とポインタTEMP、TEMP = P1ように、点TEMP 2、P1 = P2となるように、P1点関数を入れ替えます。

しかし、最終的な結果はまだ印刷された
2,5


理由:機能を使用している間、メインのコールが転送にポインタを入れ替えるが、彼らはすべてのスワップ機能で動作している:「コンテンツ値ポインタ」を変更するには、再度*演算子を使用せずに、ポインタ自体を変更します

3式:アドレス割り当てなし*ポインタ操作変化点のアドレスを意味します。

-------------------------------------------------- -------------------

例4:

する#include <stdio.hの>
ボイドスワップ(INT * P1、int型*のP2)
{
int型*の一時。
* TEMP = * P1;
* P1 = * p2の。
* P2 = *一時;
}

メイン()
{
int型、B。
int型* P1 =&、* P2 =&B;
scanf関数(%D%D、P1、P2)。
スワップ(P1、P2)。
prinf( "%のDは、%D"、* P1、P2 *)。
}

2等が挙げられます。しかし、唯一の違いは、一時はポインタではなく、通常の変数として定義されています。同じと出力2はまだのようです
2,5。

しかし、実際の実行時コンパイラが文句を言うだろう:不正なメモリは書いています。

その理由は次のとおりです。フィールドガイドとして一時、とはポイントの予約がない場合。ポイントシステム領域場合は、オペレーティングシステムがフリーズまたはクラッシュする可能性があります。

一時はすぐに初期値を与える定義されている場合は、何の問題もないでしょう。

 -------------------------------------------------- -------------------

同等のシンボルポインタ、配列

もしパラメータ、ポインタ変数処理として、配列名として配列。

int型の楽しみ(INT [10])<=> int型の楽しみ(int型* A)<=> INT楽しい([] int型)

図から分かるように、4を式:&逆数*。*また、[] [に相当し、そして&逆数です]

 

例5:

INT S [10]、B。
D [3] [6]。

 

* P INT;
P =&A; //整数P Aへの点
P&S = [2]; // P点配列sの2番目の要素に
はp =&D [2] [ 4]; ////のP 点アレイのD二行、4列目の要素。

したがって、上記の文は正しいです。

 

上記の例:

1. [10] INT Sを定義し; sがに&S等しい[0]の配列を確認するために、すなわち、すぐに私は彼が配列の最初の要素のアドレスを表すと思います。

    C言語の配列の第1のアドレスを表すデータを提供し、かつ一定のアドレスであります

また2.ポインタがINT * PPP = sで定義されている場合は、&Sに相当しながら[0]、PPP Sで販売されています。

 -------------------------------------------------- -------------------

ポインタの減算:


可変配列とアドレスへのポインタポイントは、ポインタ変数が1を加えた後、配列の次の要素を指すようにするとき、
ポインタ変数は、配列内の保存1要素の前にポイントします。

 例6:

 

フロート[10];フロート* P;
P = A&[4]; P-3点?

まず描画:

[0] | [1] | [2] | [3] | [4] | ...

[4]、P-3は正面3での初期位置P点は、[1]を指し

 5式:減算ポインタを前方または後方に移動されるn個の要素

 -------------------------------------------------- -------------------

もし

[N] INT、* P =。

あります。

アドレス3は同じです。

同等の発現の存在:

P +私は<=>&[i]はi番目の要素のアドレスを表す+を<=>します

四つの要素に相当:

同等の発現の存在:

1. *(P + I)<=> *(A + i)は、[I]は、i番目の要素の値を表し<=>

また2、P [i]は<=> [I]。P [i]は誤りなく、稀使用され、i番目の要素の値が示されています。その理由は、pと完全に同等です。

次のように整理同等の式は次のとおりです。

A)*(P + I)<=> *(A + I)<=> A [I] <=> P [I]
B)P P ++ ++ <=> <=> = P + P. 1 <=> 。P + 1 =
。C)p - <=> P-- <=> -P = P = P <=> 1. 1-
D)* P * <=> +(P +)
   説明:*と動作優先++同じレベル、*実行した後に、右から左++、最初の実行に組み合わせるの原則に従い、その
   後ろに++ pは、実行後にプラスすなわち、Pの値は、最初のポインタ、プラス1取られる
E)* P ++ <=> *(P ++)
   の前に++ Pは、その後、最初の実行を追加しますすなわち、第1によってポインタ、およびその値を移動させるには、除去Pによって指さ
F)(のP *)<=> ++ ++(* P)* P ++ <=>
    自己増力Pの内容
G )(* P) - <=> - (* P)<=> - * P
    コンテンツPがデクリメント

 

ます。https://www.cnblogs.com/kungfupanda/p/3748064.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33753845/article/details/94493403