目录
一:指针,指针变量,引用,取地址符:
前提 :
1.“ * ” 的两种用途
2." & “的两种用途
2.1:引用
2.2:取地址
补充:
二 : malloc(),动态申请地址空间
1.原型定义 void *malloc(int size);
补充:
三:—> 和 . 作用 区别
1.作用:
2.理解:
一:指针,指针变量,引用,取地址符:
-
符号“ * ” 和 指针变量
-
int *p; #这个代码的含义是: 创建一个指针变量:p, p是一个指针变量,而p前面的 “ * ” 是在声明p是一个指针变量
-
*p ; #这个代码的含义是:解引用 指针变量p (取出指针变量所存的地址中的内容)
-
int &q; #这个代码的含义是: 创建一个地址变量:q, q是一个地址变量,而q前面的 “ & ” 是在声明q是一个地址变量
-
&q; #这个代码的含义是:取地址, 取出变量q的地址 (取出指针变量所存的地址中的内容)
前提 :
-
int e = 10;
-
int a = 5;
1.“ * ” 的两种用途
-
1.1:解引用:返回指针所指对象的值
-
使用场景: 想要修改指针变量指向地址内容的值时,使用解引用
-
int *p=&a;
-
*p = 50; //此处相当于将 a中内容修改成50;
-
1.2:声明指针变量:表面该变量是指针变量
-
场景一:
-
int *p;
-
场景二:在形参声明指针
-
void test1(int* q) {
-
}
-
void main1(){
-
test1(p) ;
-
}
-
当main函数调用test函数时,test1函数空间会开辟一块新的内存空间,并且创建一个指针变量q,并且将p指针的内容 存放到q指针中(p,q是单独存在的两个指针,知识他们存储的内容是一样的;)
2." & “的两种用途
2.1:引用
-
场景一:声明引用变量
-
int &r = a; #将r 作为a的别名 和 a 一样(但是不能修改引用)
-
例如 r = 6 : #实质是 先将 a修改成6 然后r的引用也变为6
-
场景二:函数形参声明 引用变量
-
void test2(参数类型 &y)
-
void main(){
-
test(a); // 相当于 将y作为a的别名,当在test2中 修改y时,实质上的操作是:先修改了a,然后同时 y 的引用也指向 新的 a。
-
}
-
场景三:指针类型 和 引用 同时出现在形参位置
-
void test2(参数类型* &y) //此处表示,一个指针变量y ,将会成为 调用test2 时,传递过来参数的引用
-
void main(){
-
int *p=&a;//声明一个指针变量p,并且将 a的地址赋给p;
-
test2(p);
-
}
-
当main函数调用test函数时,test1函数空间会开辟一块新的内存空间,并且创建一个指针变量y,此时指针变量y 和 p 是同一个指针,q是p的别名(引用))
2.2:取地址
-
p = &a;
-
int *q = &a;
-
q = &e;//取出e的地址 赋值给指针变量q
-
printf(“%d”,*q);
-
// 10
-
上述操作 当输出*p 结果应该是 e,但这并不意味着修改了 变量a ,这只是仅仅将指针变量p内的存储内容从a的地址改为e的地址
补充:
1: int* p,q; 和 int *p,q; //表达相同含义 等价 int *p;int q;
2.二级指针:int "* *p" ; //表示 p是一个二级指针,p存储的是一个一级指针的地址
“ * * p ” //表示 二级解引用,**p 的值 是 p内存储一级指针所存储的地址内存储的数
举例: int a = 5;
int *p = &a;
int **q = &p;
print(q)
// 输出p的地址
print(*q)
//输出a的地址
print(**q)
//输出 a
二 : malloc(),动态申请地址空间
1.原型定义 void *malloc(int size);
malloc()使用 : (数据类型*)malloc(sizeof(数据类型)*申请数据数量)
malloc()返回值: malloc()返回开辟出内存空间的首地址
补充:
1.由malloc定义,其返回对象是指针类型,只能被指针变量接收
2.malloc申请空间使用完成后 需要free(),且free收到参数必须是调用malloc()时 malloc返回的地址空间首地址;
三:—> 和 . 作用 区别
1.作用:
-
A.B 则 A为对象或者结构体; 点号(.):左边必须为实体。
-
A->B则A为指针,->是成员提取,A->B是提取(*A)中的成员B,A只能是指向类、结构、联合的指针; 箭头(->):左边必须为指针;
补充:联合体(union) 参考文章:C 语言中的结构体和共用体(联合体) | 彬彬的博客 (kangzubin.com) 中第二部分
2.理解:
s.member 等价于
(&s)->member (*p).member 即是 p->member (p->member 等价于(*p).member )