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)。在不影响理解的情况下,有时对地址、指针和指针变量不区分,通称指针。
例如:
staic int p1; /p1是指向静态整型变量的指针变量/
float p2; /p2是指向浮点型变量的指针变量/
char p3; /p3是指向字符型变量的指针变量/
对于指针变量的定义,需要注意以下两点。
① 指针变量的变量名是“”后面的内容,而不是“p2”、“p3”。“*”只是说明定义的是一个指针变量。
② 虽然所有的指针变量都是等长的,但仍然需要定义指针的类型说明符。因为对指针变量的其他操作(如加、减等)都涉及指针所指向变量的数据宽度。要注意的是,一个指针变量只能指向同类型的变量。上例中的p2只能指向浮点型变量,不能时而指向一个浮点变量,时而又指向一个字符型变量。
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所指向的存储单元里的内容。通过一个指针访问它所指向的对象的值称为变量的间接访问(通过操作符“”)。
两个运算符互为逆操作。例如“&a”或者“p”就是取变量a的地址,而“a”或者“ * p”就是取指针变量a所指向的存储单元里的内容。通过一个指针访问它所指向的对象的值称为变量的间接访问(通过操作符“”)。
![](https://img2020.cnblogs.com/blog/1106621/202011/1106621-20201104104807247-1441530141.png)
代码展示:
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)/类型字节的长度
两指针相减运算,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的成员函数。