当前位置:   article > 正文

C语言中星号的使用_c语言星号

c语言星号

 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来引用这个对象的时候不可对其进行赋值!对于一个常量对象,不可以用普通的指针指向,而必须用这种指向常量的指针,原因很简单,通过普通指针可以改变指向的那个值,但是对于一个非常量对象,即普通变量,可不可以将其地址赋给指向常量的指针呢?是可以的,但是一旦这样指向之后,由于这个指针本身定义的是指向常量的指针,因而编译器统一认为其是指向

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/587705
推荐阅读
相关标签
  

闽ICP备14008679号