指针学习(1)(1)

目录

1.指针变量和地址

1.1取地址操作符(&)

1.2指针变量

1.3拆解指针 

1.4解引用操作符(*)

1.5指针类型的大小

1.6void*指针

 2.const修饰指针

2.1const修饰变量

2.2const修饰指针变量

2.2.1const在*左边

2.2.2const在*右边 

 2.2.3const在*两侧

 结论:


 

1.指针变量和地址

1.1取地址操作符(&)

&  :取出相应变量的所储存的地址。

#include <stdio.h>
int main()
{
	int a = 10;
	&a;//取出a的地址
	printf("%p\n", &a);
	return 0;
}

1.2指针变量

我们通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x006FFD70,这个数值有时候也是需要 存储起来,方便后期再使用,所以我们把这样的地址值存放在指针变量里面

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;//取出a的地址并存储到指针变量pa中

	return 0;
}

 存放在指针变量中的值都会理解为地址。(内存单元的编号 == 地址 == 指针

1.3拆解指针 

如果需要存放在指针变量里,什么类型的变量就需要储存在相对于的指针类型里面

int a = 10;
int* pa = &a;//取出a的地址并存储到指针变量pa中

在int* pa= &a;中,*是在说明pa是指针变量 ,int是在说明pa指向的是整型(int) 类型的对象。

同样如果是字符类型的变量,就应该放在字符指针变量里面,例:

char ch = 'w';
char* pc = &ch;

1.4解引用操作符(*)

*  :通过地址(指针)找到地址(指针) 指向的对象

#include <stdio.h>
int main()
{
	int a = 100;
	int* pa = &a;
	*pa = 0;// *pa 的意思就是通过pa中存放的地址,找到指向的空间,
//*pa其实就是a变量了;所以*pa = 0,这个操作符是把a改成了0.
	return 0;
}

​

1.5指针类型的大小

#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(double*));
	printf("%zd\n", sizeof(float*));
	return 0;
}

即:

32位平台下(X86)地址是32个bit位,指针变量大小是4个字节

64位平台下(X64)地址是64个bit位,指针变量大小是8个字节

注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。

1.6void*指针

void* 指针,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进行指针的+-整数和解引用的运算。

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	return 0;
}

将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。编译器给出了一个警告,是因为类型不兼容。而使用void*类型就不会有这样的问题

#include<stdio.h>
int main()
{
	int a = 10;
	char b = 'w';
	void* pa = &a;
	void* pb = &b;
	pb = pb + 1;//指针加减整数
	*pa = 100;//解引用运算
}

由此可知:void* 类型的指针可以接收不同类型的地址,但是无法直接进行指针运算。

 2.const修饰指针

在C语言中,const关键字用于声明常量,它表示变量在程序运行期间其值不可更改。当你将一个变量声明为const,编译器会确保对该变量的任何尝试修改操作都会产生错误。常量可以是简单数据类型的(如int const x = 5;),也可以是复杂表达式的(如const int arr[10] = {1, 2, 3};),还可以是指针(如const int* p = &n;  int *const p = &n;  int const * const p = &n;)

2.1const修饰变量

#include <stdio.h>
int main()
{
 int m = 0;
 m = 20;//m是可以修改的
 const int n = 0;
 n = 20;//n是不能被修改的
 return 0;
}
​
#include <stdio.h>
int main()
{
 int m = 0;
 m = 20;//m是可以修改的
 const int n = 0;
 n = 20;//n具有了常属性,是不能被修改的,但仍然是变量(常变量)
//但是在c++中,const修饰的就是常数
 return 0;
}

​

上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对n就行修改,就不符合语法规则,就报错,致使没法直接修改n。

但是如果绕过n,从n的地址下手,就可以改变了

#include <stdio.h>
int main()
{
 const int n = 0;
 printf("n = %d\n", n);
 int*p = &n;//从地址下手
 *p = 20;
 printf("n = %d\n", n);
 return 0;
}

2.2const修饰指针变量

2.2.1const在*左边

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int const* p = &a;
	p = &b;//正确
	//*p = 100;//错误
	//const在修饰变量时,放在*的左边,限制的是指针指向的内容,不能通过指针来改变指向的内容
	//但是可以改变指针本身的值(指针的指向)
	return 0;
}

2.2.2const在*右边 

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int * const p = &a;
	//p = &b;//错误
	*p = 100;//正确
	//const在修饰指针变量时,放在*的右边,限制的是指针变量本身,指针变量不能再指向其他内容了
	//但是可以通过指针变量,改变指针指向的内容
	return 0;
}

 2.2.3const在*两侧

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int const * const p = &a;
	//p = &b;//错误
	//*p = 100;//错误
	//const在修饰指针变量时,同时放在*的两侧,限制的是指针变量本身和指针指向的内容
	return 0;
}

 结论:

const修饰指针变量的时候

• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。

• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值