ポインタ変数
Cポインタ
各変数は、メモリロケーションを有し、各メモリ位置アドレスがハイフン( - )演算子のアクセスを使用して定義され、それはメモリ内のアドレスを表します。
ポインタ変数の値は、共通の変数の実際の値を持つ変数メモリアドレス値は実際の値である; *変数は、アドレスを使用してアクセスすることができます。
ポインタがCONSTとして定義されている場合:変数のアドレスは、他の変数(CONSTポインタ)を指すことはできません後、CONST前または*後に決定されます。
int *const q = &i;// q是const,q指向的这个地址,不能再改变;
*q = 26;// OK ,此时i = 26
q++; // ERROR
それは言及のconstです:このポインタを服用すると、その変数を変更することはできません。変数がないになりそうconstの
const int *q = &i;// *q是const,不能通过*q去改变i的值;
*q = 26;// ERROR ,此时(*q)是const
i = 26;//OK
q++; //OK
動的なメモリ割り当て:
;配列の最初のアドレスと同様戻り、このメモリのmalloc関数の戻りは、最初のアドレスが割り当てられます。
malloc 函数定义:
void * malloc(size_t size);
#include <stdlib.h> // 头文件
int *a;
a = (int *)malloc(number*sizeof(int));//malloc返回void * 类型,使用int * 进行类型转换
....
free(a);
関数のmalloc()とのcalloc()は、動的メモリ空間を割り当てるために使用されるが、2つのわずかに異なることができます。
malloc()関数は、メモリ空間の大きさが割り当てられる、一つのパラメータを有します。
void *型のmalloc(size_tのサイズ);
calloc()関数は、2つのパラメータ、すなわち、要素の数と各要素の大きさをとり、これらの2つのパラメータの積は、割り当てられるメモリ空間のサイズです。
void *型のcalloc(size_tのnumElements、size_tのsizeOfElement)。
呼び出しが成功した場合、関数はmalloc()と関数のcalloc()割り当てられたメモリ空間の最初のアドレスを返します。
関数のmalloc()と関数のcalloc()は大きな違い後者ができるが、割り当てられたメモリ領域を初期化しませんです。malloc()関数割り当てるメモリ空間が使用されていない場合には、各々が0となっている可能性があり、このメモリは、前に割り当てられていた場合は逆に、のレガシーは、様々なデータを有していてもよいです。これは、プログラムが正常であることができます(まだなっていない再割り当てメモリ空間を)始めたときのmalloc()関数を使用して、ですが、(また再割り当てされたメモリ空間)の期間、問題の後に発生する可能性があります。
それぞれの機能のcalloc()が割り当てられるメモリ空間がゼロに初期化されているメモリーを割り当てる要素の文字または整数型のタイプである場合、すなわち、これらの要素は、それが0に初期化されるようになります。あなたは要素のタイプはメモリを割り当てるためのポインタである場合、これらの要素は、通常はNULLポインタに初期化されるだろう、あなたは実際のデータにメモリを割り当てる場合は、これらの要素はゼロフロートに初期化されます。
例:
書式#include <stdio.hに>
INTのmain()
{
int型VAR1。
チャーVAR2 [10]。
printf( "アドレス変数VAR1:P%\ N-"、&VAR1);
のprintf( "アドレスVAR2変数:%のP \ n"は、& VAR2)。
0を返します。
}
当上面的代码被编译和执行时,它会产生下列结果:
var1 变量的地址: 0x7fff5cc109d4
var2 变量的地址: 0x7fff5cc109de
通过上面的实例,我们了解了什么是内存地址以及如何访问它。接下来让我们看看什么是指针。
什么是指针?
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
* VAR-名前を入力します。
在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针,*是一个运算符,用来取出它右边的那个指针所指的变量。以下是有效的指针声明:
INT IP; /整数ポインタ* /
二重DP; / double型のポインタ* /
float型FP; /フロートポインタ* /
チャーCH; /文字ポインタ* /
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
如何使用指针?
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:
实例
書式#include <stdio.hに>
メインINT()
{
20 INT VAR =; / *実際の宣言された変数* /
INT IP; /ポインタ変数の宣言* /
IP =&VAR;変数varに格納/ *ポインタのアドレス* /
printf(「VAR変数のアドレス:%pを\ n」は、&VAR)。
ポインタ変数に格納されている/ *アドレス* /
のprintf( "アドレス変数IPに格納されている:P%\ N-"、IP)。
/ * * /アクセス値へのポインタ
のprintf( "変数の値* IP:%D \ N-"、* IP)。
0を返します。
}
当上面的代码被编译和执行时,它会产生下列结果:
VAR変数のアドレス:bffd8b3cの
IP変数に保存されている住所:bffd8b3cの
* IP変数の値:20
C 中的 NULL 指针
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序:
实例
書式#include <stdio.hに>
メイン()がINT
{
int型* PTR = NULL;
printf(PTR "PTRアドレスは%P \ nが")。
0を返します。
}
当上面的代码被编译和执行时,它会产生下列结果:
ptr 的地址是 0x0
在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
如需检查一个空指针,您可以使用 if 语句,如下所示:
もし(PTR)/ * pが空でない場合は、完全な/
(!のPTR)IF / pがnullの場合、完全な*されている場合は/
下面的实例演示了 strchr() 函数的用法。
書式#include <stdio.hに>
する#include <string.hの>
INTメイン()
{
CONST文字列str [] =「http://www.runoob.com」。
constのchar chの= '';
char * RET。
RET = strchr(STR、CH)。
printf( "|%のC |文字列の後にある - |%sの| \ n" は、CH、RET)。
リターン(0)。
}
让我们编译并运行上面的程序,这将产生以下结果:
|.| 之后的字符串是 - |.runoob.com|
字符指针变量,可以采用下面方法赋值:
char
*; = "こんにちは";
指针变量指向的字符串内容不能被修改:
例一:指针变量指向的字符串内容不能被修改
char *p = "hello"; //字符指针指向字符串常量
*p = 'a'; //错误,常量不能被修改,即指针变量指向的字符串内容不能被修改
说明:定义一个字符指针指向字符串常量“hello”,修改指针变量指向的字符串的内容,即*p = 'a',发生错误,指针变量指向字符串常量,而常量字符串存在文字常量区,这段空间中的内容为只读内容,不能被修改,即指针变量指向的字符串内容不能被修改。
例二:指针变量的值可以被修改
char *p = "hello"; //字符指针指向字符串常量
char ch = 'a';
p = &ch; //指针变量指向可以改变
说明:定义一个字符指针指向字符串常量“hello”,同时定义一个字符变量ch,改变指针变量的指向,即让p指向字符变量ch,这样是可以的,即指针变量的指向是可以改变的。
(2)字符串数组内容可以被修改,但字符串数组名所代表的字符串首地址不能被修改