【C/C++】指针
指针变量也是一种变量,这种变量是用来存放地址的,存放在指针变量中的值都会理解为地址(在指针变量的眼里,什么都是地址)*在说明pa为指针变量,int说明pa指向的对象a是int类型的如果是字符类型呢?int main()//1. 指针的定义:数据类型* 变量名int a = 10;int* p;//给指针变量赋值p = &a;//指针指向a的地址//2. 指针的使用return 0;记住!p = &
目录
1.指针变量
1.1 内存和地址
指针就是用来访问内存
内存:房间
地址:门牌号
内存单元的编号=地址=指针
1.2 指针变量的定义与使用
指针变量也是一种变量,这种变量是用来存放地址的,存放在指针变量中的值都会理解为地址
(在指针变量的眼里,什么都是地址)
*在说明pa为指针变量,int说明pa指向的对象a是int类型的
如果是字符类型呢?
char ch='w';
char *pc=&ch;
#include<iostream>
using namespace std;
int main()
{
//1. 指针的定义:数据类型* 变量名
int a = 10;
int* p;
//给指针变量赋值
p = &a;//指针指向a的地址
cout << p << endl;
cout << &a << endl;
//2. 指针的使用
cout << "* p =" << *p << endl;
cout << "a = " << a << endl;
return 0;
}
记住!
p = &a
* p = a
* p = * &a = a,*和&抵消
1.3 指针运算
指针类型决定了指针进行+1或-1时,一次走远的距离
int*+1,走4个字节(整形的大小)
char*+1,走1个字节(字符的大小)
void* 无具体类型的指针
不是固定的某一类型的地址,就用void*
2. 指针所占用内存空间
- 32位平台下地址是32个bit位,指针变量大小是4个字节
- 64位平台下地址是64个bit位,指针变量大小是8个字节
- 指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的
×86:
×64:
#include<iostream>
using namespace std;
int main()
{
cout << sizeof(int*) << endl;
cout << sizeof(float*) << endl;
cout << sizeof(double*) << endl;
cout << sizeof(char*) << endl;
return 0;
}
3.空指针、野指针
空指针和野指针都不是我们申请的空间,引出不要访问
3.1 空指针
- 空指针用于给指针变量初始化
- 空指针是不可以进行访问的
3.2 野指针
4.const修饰指针
实验一下:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
//const修饰指针,指针指向可以改,指针指向的值不可以改
const int* p1 = &a;
p1 = &b;
//*p1 = 100;//报错
//const修饰常量,指针的指向不可以改,指针的值可以改
int* const p2 = &a;
//p2 = &b;//报错
*p2 = 100;
//const修饰指针和常量,
const int* const p3 = &a;
//p3 = &b;//报错
//*p3 = 100;//报错
return 0;
}
C中const修饰的仍是变量,C++中const修饰的变量是常量
以下三张图中红色为不可修改,黑色为可修改
4.1 const修饰指针
const放在*左边,限制的是:指针指向的内容,不能通过指针来修改指向的内容,但是可以修改指针变量本身的值(修改的指针变量的指向)
4.2 const修饰常量
const放在*右边,限制的是:指针变量本身,指针变量不能再指向其他变量了,但是可以通过修改指针变量修改指针变量指向的内容
4.3 const修饰指针和常量
5.指针和数组
5.1 区分指针数组和数组指针
注意区分指针数组,指针数组是数组,数组指针是指针
字符指针:char*,存放字符的地址
整形指针:int*,存放整形的地址
数组指针:存放数组的地址,指向数组的指针
请思考下面代码的意义?
int* p1[10];
int(*p2)[10];
p1是指针数组,存放指针的数组
p2是指针变量,指向的是数组
5.2 利用指针访问数组元素
访问arr默认就是数组首元素地址
利用for循环逐个访问数组元素
6. 指针和函数
要点:
- 值传递不会改变实参
- 地址传递会改变实参
值传递地址传递
#include<iostream>
using namespace std;
void swap1(int a, int b)
{
int temp = a; a = b; b = temp;
}
//void swap2(int *p1, int *p2)
//{
// int temp = *p1; *p1 = *p2; *p2 = temp;
//}
int main()
{
int a = 10;
int b = 20;
swap1(a, b);
//swap2(&a, &b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
7. 结构体指针
结构体,结构体指针https://blog.csdn.net/2301_76153977/article/details/150353517?spm=1001.2014.3001.5501
更多推荐
所有评论(0)