C语言中指针, 数组和字符串(Pointer, Array and String in C Programming Language)

本文详细介绍了C语言中指针、数组和字符串的概念及其相互关系。指针是一个保存对象或函数地址的变量,有常量指针和指向常量的指针之分。数组是一块连续内存,数组名非变量且不可赋值,表示数组起始地址。字符串是字符数组,以null('')字符结尾。数组和指针关系密切,数组名作为参数传递时相当于指针。字符串常量不可修改。文章还讨论了sizeof和strlen的区别,以及初始化方法,强调了不同内存区域的特性与限制。
摘要由CSDN通过智能技术生成

指针

在C语言中,指针是一种衍生类型(derived type).  一个指针就是一个保存某个对象或函数的地址的变量("A pointer is a variable that contains the address of a variable")[10](p93).  例如:

int* pa;

其中pa是一个指向整型数的指针,整型数是pa的基础类型(referenced type) . 常量指针的声明格式如下所示:

float * const const_pointer_a

const_pointer_a是一个指向整型数的常量指针, 其中的const是修饰const_pointer_a的。下面这行代码

const float * pointer_const_a

pointer_const_a是一个指向常量整型数的指针, 其中的const是修饰float的. 又如:

struct tag (*[5])(float)

是一种包含5个函数指针的数组,其中函数指针的基础类型是一种以一个float做参数,返回值为名为struct tag的数据结构.

 数组

在C语言中,声明一个数组:

int a[10]; 

其相应的汇编代码(VC2015)是:  

COMM	_a:DWORD:0aH

其中“0aH”即数组长度10(16进制为0a)

有以下含义:

1. 声明了一个名为a的数组;  (a是一个数组的名字)
2. 为数组a在内存空间申请一块连续的内存块; 
3. 这个内存块能保存10个int型变量, 这些int型变量名分别为a[0], a[1], ... , a[9] ;
4. 数组名a不是变量(不能当作l-value被赋值),它代表的是包含多个变量的一个数组。(在计算机机器代码实现C语言中定义的数组结构时,不能将保存数组的内存块像整型数那样当作一个整体在计算机存储空间和CPU之间复制过来,拷贝过去。因此在具体实现中保存数组中第一个变量的地址保存给数组名a)

如果在数组声明中没有指明数组长度,会引发编译错误(在VC2015中, 直接将这行代码忽略掉)。例如:

int array[]; //这行代码直接被编译器优化掉了,如果程序后面的代码中使用变量array,会引发编译错误。

C语言中, 数组和指针的关系十分密切。 C语言程序运行时, 任何使用数组下标实现的操作都可以通过指针实现,而且通常使用指针耗时更少[10]p97 ("Any operation that can be achieved by array subscripting can also be done with pointers. The pointer version will in general be faster (at least to the uninitiated)" )。 

字符串

C语言的基本数据类型中没有字符串。 C语言中使用字符数组保存字符串,null('\0')字符表示字符串的结束。也就是说在C语言中字符串是以一个以null('\0')字符结尾的字符数组。例如:

char label[] = "Single";

在内存中的保存形式如下[1]:

------------------------------
| S | i | n | g | l | e | \0 |
------------------------------

其相应的汇编代码(VC2015)是:  

_label	DB	'Single', 00H

null('\0')是C语言内定的字符串结尾标识, 因此字符串是不应包含null('\0')字符。

C语言中提供字符串常量,例如:

char str[] = "Single";
char *message = "Single";

其相应的汇编代码(VC2015)是:  

PUBLIC	_message
_DATA	SEGMENT
_str	DB	'Single', 00H
	ORG $+1
_message DD	FLAT:$SG4519
$SG4519	DB	'Single', 00H
_DATA	ENDS

使用字符串常量会产生一个指向字符串的常量指针,如上述代码中的mesage实际上是一个指针(就是$SG4519)。C语言的发明人Brian W. Kernighan 和 Dennis M. Ritchie[10] 没有提及字符串常量中的字符是否可以被修改. C语言标准(ANSI C)则明确声明修改字符串常量的效果是未定义的。 

指针、数组和字符串之间的关系

指针、数组和字符串之间的关系如下图所示:数组保存在计算机中一块连续的内存段中;字符串是一个以null('\0')字符结尾的字符数组;对数组元素的操作是通过指针实现的。

数组->指针

当数组名作为参数传递给某一函数时,由于C语言是值传递,因此实际传递给函数的是数组第一个元素的地址。在C语言中,函数的参数在调用函数时是作为局部变量使用,数组名参数实际上就当作一个保存某变量地址的局部变量(也就是指针)使用[10]p99。因此在函数中,使用操作符sizeof()作用于数组名函数参数得不到其数组长度

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值