指针2-

指针二

一、练习题

1.小端模式:低位储存在低字节,高位储存在高字节,从高向低读取

一位十六进制对应四位二进制

两位十六进制对应一个字节

int num = 0xabcd1234;
	int* pn = #
	short* p = (short*)pn;
	printf("%x\n", *p);
	printf("%x\n", *(p + 1));
	

image-20201201193547032

int arr[5] = { 1,2,3,5,6 };
	int* p = &arr[0];
	int* p1 = p++;
	//printf("%p\n", p);
	//printf("%p\n", p1);
	cout << *(p1 + 2) << endl;//3
	int** pp = &p;
	int* p2 = (int*)((int)(*pp) + 4);
	cout << *p2 << endl;//3
	/*
	*pp取的是int* p ==>就是p的地址
	*/
	
注意:究竟是指针加减还是整数加减
short sh[5] = { 1,2,3,4,5 };
	short* psh = sh;
	printf("%x\n", *psh);//1
	int* p = (int*)psh;
	printf("%x\n", *p);//20001
	printf("%x\n", *(p + 1));//40003

image-20201201202917981

二、指针数组的关系

指针数组:是数组,指针类型的数组

本质上是数组,元素类型是指针

int a, b, c;
	a = 1;
	b = 2;
	c = 3;
	int *pa, *pb, *pc;
	pa = &a;
	pb = &b;
	pc = &c;
	//arr:指针数组  长度:3   元素类型:int*
	int* arr[3] = { pa,pb,pc };
	cout << *(*arr) << endl;
	cout << *arr[0] << endl;
	cout << arr[0][0] << endl;
	//p[n]=p+n
	cout << *(arr[1]) << endl;
	//arr[1]=*(arr+1)
	cout << *(*(arr + 1)) << endl;
	cout << arr[1][0] << endl;
数组指针:是指针,指向数组的指针

本质上是指针:元素类型是数组

typedef int(*parr)[3];//parr指的是整个int(*parr)[3],使用的时候还需要取一个名字
typedef int Arr[3];
int main()
{
	Arr arr1 = { 1,2,3 };
	Arr* p1 = &arr1;
	parr p2 = &arr1;
	//定义了两个数组指针

	int arr[3] = { 1,2,3 };
	//数组元素类型:int
	//数组本身类型:int[3]

	//指针指向的类型:int[3]
	//指针本身的类型:int(* )[3]
	int(*p)[3] = &arr;
	//数组指针 (*p)是一个整体,数组名
	cout << (*p)[0] << endl;//
	cout << **p << endl;//
	cout << p[0][0] << endl;//
	//需要两层取内容,因为第一层是取的整个数组的arr的内容
	//第二层取的是arr[0]里的内容
	return 0;
    
}    

课后习题
1,画图
char arr[3][10] = {
		{"abcd"},
		{"ABCD"},
		{"\012345"}
	};
	//printf("%s", arr[2]);
	char* p0 = arr[0];
	cout << p0[1]<< endl;
	char* p1 = arr[1];
	char* p2 = arr[2];
	char* parr[3] = { p0,p1,p2 };
	char* (*pp)[3] = &parr;
	//名字叫(*pp)的char*类型的数组
	char(*pb)[3][10] = &arr;
	//名字叫(*pb)的char类型的数组
	cout << pb[0][1] << endl;
	cout<<pb[0][1][2]<<endl;
	cout << pp[0][1] << endl;
	cout << pp[0][1][2] << endl;
//画图

2
double** (*p)[3][4][5] = nullptr;
	cout << sizeof(p) << endl;/*对应的类型double**(*)[3][4][5] (指针)  p是一个指针 四个字节  而且是一个数组指针
(*p)表示这个指针叫p  , 指向double** [3][4][5]这个指针类型的数组*/
	cout << sizeof(*p) << endl;//double** [3][4][5](数组)
//一共有3*4*5=60的元素,字节=60*4=240
	cout << sizeof(**p) << endl;//double** [4][5](数组)
//字节数=4*5*4=80
	cout << sizeof(***p) << endl;//double** [5](数组)
//字节数=5*4=20
	cout << sizeof(****p) << endl;//double**(指针)
//字节数=4
	cout << sizeof(*****p) << endl;//double*(指针)
//字节数=4
	cout << sizeof(******p) << endl;//double(浮点型)
//字节数=8

	//1.求结果
	//2.写出每一次sizeof(),括号里的对应的类型

二维数组可以视为多个一维数组

常量 const是一个修饰符

常量与指针

指针指向一个常量

可以改变指向,但是由于指向的是一个常量,所以不能通过指针改变指向的内容

C语言和c++中const的区别

C语言:(假)可以通过指针绕过变量本身的const

c++:真,永远不能改变

const int num = 10;

	const int* p1 = &num;
	int const* p2 = &num;

	//*p1=20 不允许(c++) 
	//说明const在c++中是真的

	//*p1=20 允许(c)
	//说明在c语言中const是假的

const int num = 10;
	//在C语言中,可以通过下面操作
	int* p = &num;
	*p = 20;
	//在c++中,不能通过下面操作
	int* p = &num;
	*p = 20;

指针与常量

指针本身是一个常量

不可以改变指向,必须初始化

因为常量是必须初始化的

可以通过指针去改变指向的内容

int num = 10;
	int* const p = &num;
	//这是一个指针常量
	int a = 0;
	//p=&a==>不行
	*p = 20;//可以
//因为*p指向的是int类型
//而p是被修饰的指针

常量指针常量

自己是常量,指向的也是常量

不能改变指向(必须初始化)

不能通过指针修改被指向的内容

int num = 10;
	const int* const p = &num;
	//这是一个常量指针常量
	int a = 0;
	//p=&a  ==>不行
	//*p = 20;//不可以
//因为指针,int整型都是常量不能改变。
//不能改变指向

//但是可以通过改变num来改变p
num=20;


posted @ 2020-12-02 23:00  kisfly  阅读(40)  评论(0编辑  收藏  举报