郑州市建设投资集团公司网站,深圳企业网站建设推荐公司,wordpress 博客 注册,辽宁建设工程信息网公司评分C语言 指针
学习 C 语言的指针既简单又有趣。通过指针#xff0c;可以简化一些 C 编程任务的执行#xff0c;还有一些任务#xff0c;如动态内存分配#xff0c;没有指针是无法执行的。所以#xff0c;想要成为一名优秀的 C 程序员#xff0c;学习指针是很有必要的。
…C语言 指针
学习 C 语言的指针既简单又有趣。通过指针可以简化一些 C 编程任务的执行还有一些任务如动态内存分配没有指针是无法执行的。所以想要成为一名优秀的 C 程序员学习指针是很有必要的。
正如您所知道的每一个变量都有一个内存位置每一个内存位置都定义了可使用连字号运算符访问的地址它表示了在内存中的一个地址。请看下面的实例它将输出定义的变量地址
#include stdio.hint main ()
{int var1;char var2[10];printf(var1 变量的地址 %x\n, var1 );printf(var2 变量的地址 %x\n, var2 );return 0;
}尝试一下
当上面的代码被编译和执行时它会产生下列结果
var1 变量的地址 bff5a400
var2 变量的地址 bff5a3f6通过上面的实例我们了解了什么是内存地址以及如何访问它。接下来让我们看看什么是指针。
什么是指针
指针是一个变量其值为另一个变量的地址即内存位置的直接地址。就像其他变量或常量一样您必须在使用指针存储其他变量地址之前对其进行声明。指针变量声明的一般形式为
type *var-name;在这里type 是指针的基类型它必须是一个有效的 C 数据类型var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是在这个语句中星号是用来指定一个变量是指针。以下是有效的指针声明
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch /* 一个字符型的指针 */所有指针的值的实际数据类型不管是整型、浮点型、字符型还是其他的数据类型都是一样的都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是指针所指向的变量或常量的数据类型不同。
如何使用指针
使用指针时会频繁进行以下几个操作定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作
#include stdio.hint main ()
{int var 20; /* 实际变量的声明 */int *ip; /* 指针变量的声明 */ip var; /* 在指针变量中存储 var 的地址 */printf(Address of var variable: %x\n, var );/* 在指针变量中存储的地址 */printf(Address stored in ip variable: %x\n, ip );/* 使用指针访问值 */printf(Value of *ip variable: %d\n, *ip );return 0;
}尝试一下
当上面的代码被编译和执行时它会产生下列结果
Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20C 中的 NULL 指针
在变量声明的时候如果没有确切的地址可以赋值为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序
#include stdio.hint main ()
{int *ptr NULL;printf(ptr 的值是 %x\n, ptr );return 0;
}尝试一下
当上面的代码被编译和执行时它会产生下列结果
ptr 的值是 0在大多数的操作系统上程序不允许访问地址为 0 的内存因为该内存是操作系统保留的。然而内存地址 0 有特别重要的意义它表明该指针不指向一个可访问的内存位置。但按照惯例如果指针包含空值零值则假定它不指向任何东西。
如需检查一个空指针您可以使用 if 语句如下所示
if(ptr) /* 如果 p 非空则完成 */
if(!ptr) /* 如果 p 为空则完成 */C 指针详解
在 C 中有很多指针相关的概念这些概念都很简单但是都很重要。下面列出了 C 程序员必须清楚的一些与指针相关的重要概念
概念描述指针的算术运算可以对指针进行四种算术运算、--、、-指针数组可以定义用来存储指针的数组。指向指针的指针C 允许指向指针的指针。传递指针给函数通过引用或地址传递参数使传递的参数在调用函数中被改变。从函数返回指针C 允许函数返回指针到局部变量、静态变量和动态内存分配。C语言 字符串
在 C 语言中字符串实际上是使用 null 字符 终止的一维字符数组。因此一个以 null 结尾的字符串包含了组成字符串的字符。
下面的声明和初始化创建了一个 Hello 字符串。由于在数组的末尾存储了空字符所以字符数组的大小比单词 Hello 的字符数多一个。
char greeting[6] {H, e, l, l, o, };依据数组初始化规则您可以把上面的语句写成以下语句
char greeting[] Hello;以下是 C/C 中定义的字符串的内存表示 其实您不需要把 null 字符放在字符串常量的末尾。C 编译器会在初始化数组时自动把 放在字符串的末尾。让我们尝试输出上面的字符串
#include stdio.hint main ()
{char greeting[6] {H, e, l, l, o, \0};printf(Greeting message: %s\n, greeting );return 0;
}尝试一下
当上面的代码被编译和执行时它会产生下列结果
Greeting message: HelloC 中有大量操作字符串的函数
序号函数 目的1strcpy(s1, s2); 复制字符串 s2 到字符串 s1。2strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。3strlen(s1); 返回字符串 s1 的长度。4strcmp(s1, s2); 如果 s1 和 s2 是相同的则返回 0如果 s1s2 则返回小于 0如果 s1s2 则返回大于 0。5strchr(s1, ch); 返回一个指针指向字符串 s1 中字符 ch 的第一次出现的位置。6strstr(s1, s2); 返回一个指针指向字符串 s1 中字符串 s2 的第一次出现的位置。
下面的实例使用了上述的一些函数
#include stdio.h
#include string.hint main ()
{char str1[12] Hello;char str2[12] World;char str3[12];int len ;/* 复制 str1 到 str3 */strcpy(str3, str1);printf(strcpy( str3, str1) : %s\n, str3 );/* 连接 str1 和 str2 */strcat( str1, str2);printf(strcat( str1, str2): %s\n, str1 );/* 连接后str1 的总长度 */len strlen(str1);printf(strlen(str1) : %d\n, len );return 0;
}尝试一下
当上面的代码被编译和执行时它会产生下列结果
strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10您可以在 C 标准库中找到更多字符串相关的函数。