C语言中星号的使用

本文详细探讨了C语言中星号(*)的多种用途,包括作为乘法运算符、定义指针、指针的类型关联、const修饰符在指针中的应用、函数与指针的关系、数组与指针的交互,以及typedef和引用的概念。通过实例解释了如何理解和使用这些概念,特别是指针与数组、函数、常量和多维数组的交互,以及指针类型的复杂定义和转换。
摘要由CSDN通过智能技术生成

 C语言中星号的使用

 

1、乘法运算符

 

2、定义指针

int *p 0; 还是 int* 0;

后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇怪的东西。但是后面一种写法会带来一个容易产生的误解:

int* p1, p2;

这儿给人的感觉似乎是定义了两个指针型变量p1p2,但是,事实上,这种直觉是错误的,正确的理解方式是int *p1, p2;p1是指针型的,而p2确是整型的。

MS VC++ 6.0中,是按照后面一种格式写的。

 

3、何谓指针?

指针仅仅表示一个内存中的某个地址?

非也,注意到,我们在定义指针的时候,都关联了一个类型,如intchar,或者是string等等,如果说指针仅仅表示一个内存中的地址,那何必要关联这么多变化的东西呢?完全可以DWORD p0;这样解决问题。

关联了的数据类型是作何用的呢?

它可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。如 int *p;

编译器可以从这个定义中获得信息:

1、p指向的内存存放的是整型数据,

2、由于该内存区域只存放了一个数据,跨越的内存区域为4个字节,即p+1的效果是跳过了四个字节。

另一个复杂一点的例子,如

struct a

{int x1;

short x2;

*next;

}

定义指针 *p;那么编译器对这个指针又作何解释呢?

1p指向的内存区域依次存放了三种类型的数据,分别是intshort和一个指针型数据。

2p指向的内存区域跨越了12个字节,即p+1的效果是跳过了12个字节。(为何不是10?对齐的原因)

 

但是,C++中定义了一种特殊的指针,它去除了一般指针中对内存区域内容以及大小的解释,以满足特定的需要,如我们只需要某块内存的首地址,不需要考虑其中的数据类型以及大小。这种形式为 void *; 这种类型的指针可以被任意数据类型的指针赋值,如上面的a* 型,void *q p; 唯一例外的是,不能把函数指针赋给它。

 

4、关于const修饰符

const遇到指针,麻烦事就来了,

看:const int* p; int* const p; const int* const p;

这三个表达式,

第一个表示p是一个指针,p本身平凡无比,但是p所指向的对象是一个特殊的对象--整型常量;

第二个表示:这个p指针不是一个普通的指针,它是个常量指针,即只能对其初始化,而不能赋值,另外,这个指针所指向的对象是一平凡的int型变量;

第三个则结合了前两者:指针和指向的对象都非同寻常,都是常量。

有了const,赋值的问题就变得麻烦起来,

首先,对于 const int* p;这儿由于p指向的对象是个常量,所以在通过p来引用这个对象的时候不可对其进行赋值!对于一个常量对象,不可以用普通的指针指向,而必须用这种指向常量的指针,原因很简单,通过普通指针可以改变指向的那个值,但是对于一个非常量对象,即普通变量,可不可以将其地址赋给指向常量的指针呢?是可以的,但是一旦这样指向之后,由于这个指针本身定义的是指向常量的指针,因而编译器统一认为其是指向

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值