C基础

&表示取变量的地址值

int main(int argc, const char * argv[]) {
    int i;
    char a;
    i = 30;
    a = 't';
    printf("%p\n%p\n",&i,&a);
    return 0;
}
运行结果:
0x7fff5fbff83c
0x7fff5fbff83b
Program ended with exit code: 0

  

int *p; p表示的是一个指针变量,它的值是某个整型变量的地址。int * 是一个数据类型,叫做指针类型。

 

内存单元的地址称为指针。专门用来存放地址的变量,称为指针变量(pointer variable)。在不影响理解的情况下,有时对地址、指针和指针变量不区分,通称指针。

所有数据类型的指针(整型、字符型、数组、结构等)在32位机上都是32位(4个字节)。也就是说指针只与操作系统有关。
 
例如:
staic int p1; /p1是指向静态整型变量的指针变量/
float p2; /p2是指向浮点型变量的指针变量
/
char p3; /p3是指向字符型变量的指针变量/
对于指针变量的定义,需要注意以下两点。
① 指针变量的变量名是“
”后面的内容,而不是“p2”、“p3”。“*”只是说明定义的是一个指针变量。
② 虽然所有的指针变量都是等长的,但仍然需要定义指针的类型说明符。因为对指针变量的其他操作(如加、减等)都涉及指针所指向变量的数据宽度。要注意的是,一个指针变量只能指向同类型的变量。上例中的p2只能指向浮点型变量,不能时而指向一个浮点变量,时而又指向一个字符型变量。

指针变量的值只能是变量的地址,不能是其他数据,否则将引起错误。
 
C语言中提供了地址运算符“&”来表示变量的地址,其一般形式为: &变量名;
如“&a”表示变量a的地址,“&b”表示变量b的地址。
 
& — 取地址运算符;
 * — 指针运算符(间接存取运算符)。
如:int a = 100;  int * p = &a;
两个运算符互为逆操作。例如“&a”或者“p”就是取变量a的地址,而“a”或者“ * p”就是取指针变量a所指向的存储单元里的内容。通过一个指针访问它所指向的对象的值称为变量的间接访问(通过操作符“”)。

 

 代码展示:

int main(int argc, const char * argv[]) {
    //int a,b;
    //printf("%d\n",p(a));

    //指针的运算
    int a = 10;
    double  b = 20;
    int *p = &a;
    double *q = &b;
    printf("a = %d &a = %p\n", a, &a);
    printf("p = %p p+2 = %p\n", p, p+2);
    printf("b = %f &b = %p\n", b, &b);
    printf("q = %p q+2 = %p\n", q, q+2);
    return 0;
}
运行结果:
a = 10 &a = 0x7fff5fbff83c
p = 0x7fff5fbff83c p+2 = 0x7fff5fbff844
b = 20.000000 &b = 0x7fff5fbff830
q = 0x7fff5fbff830 q+2 = 0x7fff5fbff840
Program ended with exit code: 0

  

通过上面的例子,我们可以看到,p保存的地址就是a的地址,对指针变量p进行加2,实则就是相当于在地址上进行偏移同一数据类型占字节乘以2,我们已经知道,sizeof(int)是4,sizeof(double)是8。根据程序结果, 整型指针p+2,地址增加了8,相当于两个整数。double指针q+2,增加了16,相当于两个双精度浮点数。注意此程序是在研究指针的运算,打印p+2,q+2代表的地址。并没有修改对应的内存单元的内容。
两指针相减运算,p-q 运算的结果是两指针指向的地址位置之间相隔数据的个数。因此,两指针相减不是两指针的值相减的结果,而是按下列公式计算出的结果:(p-q)/类型字节的长度

我们首先首先定义一个结构类型,

struct student
{
   char *name;
   int ages;
};

再根据类型定义结构体变量 struct student stu={"Rose",15};定义一个指针指向结构体类型,struct student *p;把结构体变量stu的地址赋给指针变量p,p=&stu;我们可以有3种方式来访问结构体中的属性ages:

stu.ages=15;(*p).ages=15;p->ages=15;不过第三种方式在C语言中只能用来指向结构体。

C++中::的用法:

 

1、作用域符号 

前面一般是该类名称,后面是该类的成员名称。C++为避免不同的类有相同的成员而采用作用域的方式进行区分,eg:A,B表示两个类,在A,B中都有成员member,那么:A::member表示A中的成员member,B::member表示B中的成员member。 

2、全局作用域符号 

当全局变量在局部函数中与其中某个变量重名时,可以用::来区分,否则局部变量会屏蔽全局变量。 

3、作用域分解运算符 

比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f函数的定义,那么在类外定义f时,就要写成void A::f(),表示这个f函数是类A的成员函数。
 
 
 

 

posted on 2020-11-04 11:16  永不宕机  阅读(81)  评论(0编辑  收藏  举报

导航