目录
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如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。
标签:const,变量,int,学习,地址,pa,指针 From: https://blog.csdn.net/2401_85711575/article/details/141067811