2つの文字列のポインタ、魔法

Cでは、文字列処理は、非常に複雑である文字は、直接割り当てへのポインタである場合を除き、直接、割り当てることはできません。文字列は通常、文字の配列である、それは文字配列を割り当てることができます)の使用はstrcpy(に持っていると述べました。

このため、文字列処理、多くの場合、二つのポインタに遭遇します。彼らが学んだことレッツ・要約します。

1.文字と文字配列のポインタ

文字ポインタに割り当てられた文字の配列は、&文字列の前にアドレスブレークを追加する必要が割り当てを指示することはできません。

文字の配列への代入2

直接割り当て記号「=」が、strcpyの()関数を使用することはできません。

文字ポインタへのポインタ3

文字** char_pointer =&cell_content_char;これは最初のアドレスポインタには2つの文字ポインタです。

そして* char_pointer文字がアドレス格納された値で指され、この文字が文字ポインタの配列の割り当てでいます。したがってcell_content、cell_content_char、* char_pointer値は同じです。

2〜4のポインタ割り当て

(*(* Char_pointer))= NULL;これは最初のアドレスに格納されたヌル文字char_pointポインタ、即ち、ヌルとcell_contentで置換された最初の文字cell_content_charに割り当てられた値です。

「私が借りている」による出力 - >「yが借りています」

ポインタのインクリメント

(* Char_pointer)++;このポインタは、すなわち、元の文字列の最初のポイントである、文字のすなわち位置が「私は」今バックいずれかを移動させて、「位置が配置され、1戻されます。*(char_pointer)はcell_content_charに向けられているので、このポインタシフトすることを、シフトは、cell_content_charあるメモ、アドレスポインタ変数から知られている2つの。

- >メモや(*(* char_pointer))++の違い!この操作は無意味です。

その後、両者の割り当て及びポインタは、文字「Y」を交換する時間が第2の原位置」にあります。

したがって、値は*(char_pointer)値であるcell_content_char 'yowe' となります。

そして、cell_contentの値は、2番目のビットが変更され、保存されたアドレスの文字の残りの部分は変更されていません。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define cell_lenght 10

int main(void)
{

	char null = 'y';
	char cell_content[cell_lenght]; //字符数组
	char *cell_content_char = cell_content;//字符数组赋值给字符指针
	char **char_pointer = &cell_content_char;
	//cell_content_char = "i love";
	printf("default value.\n");
	strcpy(cell_content, "i owe");
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);
	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer);
								// char_pointer是指向cell_content_char的指针,保存的是其首地址。
								// *char_pointer      是cell_content_char字符串的值
						
	printf("starting 1st eval test.\n");
	(*(*char_pointer)) = null;  //替换cell_content_char字符串的首字符

	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer);
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);

	printf("starting 2nd eval test.\n");
	(*char_pointer)++;         //将cell_content_char指针移到下一位,(*char_pointer)指的是cell_content_char字符指针和cell_content字符串数组,
								//即指向了cell_content字符串数组"i owe"的第二位 space
	(*(*char_pointer)) = null; //替换cell_content字符串数组第二位空格为null
								//由于指针移到第二位了,所以*char_pointer和cell_content_char的首地址为第二位。
								//cell_content第一位不变,而是第二位插入了null
	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer); 
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);

	return 0;
}

結果を印刷します:

デフォルト値。
cell_content_char =私が借りて、アドオン= 008FF70C。
cell_content =私が借りて、アドオン= 008FF70C。
* char_pointer =私は= 008FF70Cを追加し、借りています。
第一evalのテストを開始します。
* char_pointer = yは= 008FF70Cを追加し、借りています。
cell_content_char = yが借りて、アドオン= 008FF70C。
cell_content = yが借りて、アドオン= 008FF70C。
第二のevalのテストを開始します。
* char_pointer = yowe、= 008FF70Dを追加します。
cell_content_char = yowe、アドオン= 008FF70D。
cell_content = yyowe、= 008FF70Cを追加します。
テストを終了します。

リリース元の4件の記事 ウォンの賞賛0 ビュー60

おすすめ

転載: blog.csdn.net/IPGsoz/article/details/104885020