在c语⾔中表⽰取某变量地址的运算符,指针地址与取值运算符-
C语⾔程序设计...
///01.地址.c
#include
#include
int get()
{
return 10;
}
//01.严格进⾏变量区分:
// 1.普通变量和指针变量
/
/ 2.严格的变量类型:
// 常规类型+特殊类型
//02.对变量取地址的操作发起于寄存器当中
// 因此地址也⽣成于寄存器变量当中,C语⾔⽆法直接访问
//03.关于取地址符不能操作的两种情况:
// &&intNum;-->C语⾔⽆法直接操作寄存器变量
// &get();-->返回值存储与寄存器的(cache)区,或者程序的(备份内存),这两块⼉内存都不可直接访问
int main01(void)
{
int intNum;
&intNum;//这⾥获取⼀个声明但没有初始化的普通变量的所属地址可以,但是如果是指针类型的变量就不⾏了
//&&intNum;//&intNum这个表达式所代表操作执⾏于寄存器当中,在寄存器当中使⽤寄存器变量进⾏存储,因此C语⾔⽆法进⾏寄存器变量的操作
// ⽽且&intNum所获得的数据来⾃于CPU-->寄存器-->代码区-->符号表中,因此不能通过取地址运算符进⾏操作(C语⾔相对于汇编语⾔的缺点)
//&get();//get();的返回值,也就是函数的返回值可能存储于两个常见位置:寄存器的缓冲区(cache),应⽤程序的备份内存,因此返回值不可取地址
system("pause");
}
///02.内容.c
#include
#include
//01.取值运算符("*")与取地址运算符("&"):
/
/ 1.星号("*")表⽰取值运算符,也就是根据指针访问内存块⼉
// 2.与号("&")表⽰取地址运算符,也就是根据变量的内存实体获取变量的地址
//02.对指针变量使⽤取值运算符(星号:"*")的使⽤规律:
// ⽤原始指针类型的指针级别减去取地址运算符的个数;
// 就是当前所访问的具体变量(普通变量和指针变量)
// 结果为0-->普通变量
// 结果为1-->⼀级指针变量
指针变量本身有地址吗// 结果为2-->⼆级指针变量
// 结果为n-->N级指针变量
int main02(void)
{
/
/*(001) = 1;//由于常量读取于代码区符号表,产⽣于CPU寄存器,因此C语⾔不能够直接进⾏访问
int intVar = 10;
*(&intVar) = 3;//星号(*)表⽰取值运算符,也就是根据指针访问内存区块⼉
printf("%d \n", intVar);
system("pause");
}
//03.取值运算符(星号:"*")的操作对象实质必须是指针
// 注:*&intVar-->严格区分执⾏流程
int main03(void)
{
int intVar = 10;
*&intVar = 3;//*&这两个符号可以同时进⾏出现,操作流程为:取地址运算符(与号:"&")先进⾏取地址操作,再根据取值运算符(星号:"*")根据指针获取该指针所指向的内存实体|数据实体
//**&intVar;//编译报错-->由于*&intVar之后的结果为普通变量类型(int)-->取值运算符的操作对象必须是指针类型,也就是含有(星号:"*")的类型
printf("%d \n", intVar);
system("pause");
}
//04.凡是涉及到的操作和运算的步骤都是由CPU在寄存器当中进⾏执⾏的,这⾥的强制类型转换属于"读取"并"转换"的操作
// 因此属于寄存器操作,要进⾏间接修改数据,必须得先获取到相应的指针,⽽且指针类型必须是可以修改的,这样就有可能涉及到
// 指针变量的类型转换操作
//05.*(int *)&num这段⼉代码的详细解释:
// 0.这些符号都是⽤于对变量名进⾏操作的
// 注:对变量进⾏的操作实质其实是对内存实体(数据实体)直接进⾏操作
// 1.取地址运算符(与号:"&")最接近于变量名称,所以优先执⾏
// 2.强制类型转换操作(int *)次接近于变量名称,所以其次执⾏
// 3.取值运算符(星号:"*")再次接近于变量名称,所以再其次执⾏
int main04(void)
{
const int num = 3;//在C语⾔中,Const关键字在处理普通变量的时候,只能够避免对变量的直接修改,但是避免不了间接修改(普通变量适⽤,指针变量稍有差别)
//num = 1;//直接修改,编译报错
(int)num;//对任何变量的强制类型转换操作,强制转换之后的数值产⽣于CPU的寄存器
*(int *)&num = 10;//int *类型转换,这⾥要特别注意,const int需要被看做为整体的⼀个类型进⾏处理
printf("%d \n", num);
system("pause");
}
//06.关于空类型的指针与空指针的区分:
// 空类型的指针:
// 严格说是空类型的指针变量-->该指针变量没有具体类型,只是⽤于存储地址(没有类型含义)⽽已
// 因此不能直接对空类型的指针变量进⾏数据实体的访问操作,没有明确解析步长和解析⽅式
// 空指针:
// 就是⽤于标识指针变量没有存储任何有实际意义的地址-->空置的指针变量⽽已
// 实质形式:NULL-->(void *)0
// 区分:空类型的指针是左值,空指针属于右值
int main05(void)
{
int intVar = 10;
intVar = 3;
void * pIntVar = &intVar;//空类型的指针多⽤于多线程的数据传送处理
//printf("%d \n", *p);//不可以直接操作空类型的指针
system("pause");
}
void change01(int * pNum)//副本机制,数组除外
{
*pNum = 10;
}
int main06(void)
{
int num = 20;
change01(&num);
printf("%d \n", num);
system("pause");
}
///03.指针实战.c
#include
#include
/
/01.如何快速确定⼀个变量的所属类型?
// 变量名称对称法(直接看声明变量的代码块⼉,进⾏直观对称得出)
int main07(void)
{
double db = 10.8;
double dbl = 10.9;
double * p = &db;
printf("%d \n", sizeof(p));//指针变量-->类型(double *)-->占⽤4个内存字节
printf("%d \n", sizeof(*p));//数据实体-->类型(double)-->占⽤8个内存字节
*p = 10.6;
printf("db = %lf, dbl = %lf, *p = %lf \n", db, dbl, *p);//10.6 10.9 10.6
p = &dbl;
printf("db = %lf, dbl = %lf, *p = %lf \n", db, dbl, *p);//10.6 10.9 10.9
*p = 9.2;
printf("db = %lf, dbl = %lf, *p = %lf \n", db, dbl, *p);//10.6 9.2 9.2
dbl = 2.1;
printf("db = %lf, dbl = %lf, *p = %lf \n", db, dbl, *p);//10.6 2.1 2.1
system("pause");
}
///04.指针副本机制.c
#define _CRT_SECURE_NO_WARNINGS
#include
#include
//01.函数形式参数的副本机制:
// 1.在C语⾔当中,函数形式参数传参的副本机制只有数组例外,因为提升效率,节约内存拷贝
// 2.跨函数改变变量(普通变量|指针变量)的传参要素
// 被掉函数修改主调函数当中的普通变量,需要普通变量的地址
// 被掉函数修改主调函数当中的指针变量,需要指针变量的地址
// 注:总之在被掉函数当中修改主调函数的变量,⽆论是普通变量还是指针变量,必须传递变量的地址
// 否则绝对不⾏
//void change02(int a, int b);//副本机制,被掉函数需要修改主调函数当中的变量,需要由主调函数向被掉函数传递该待修改变量的所属地址
void change02(int * pa, int * pb)
{
printf("change02:&pa = %p, &pb = %p \n", &pa, &pb);
//int * pTemp;//某些编译器会编译不通过!
int * pTemp = pa;
pa = pb;
pb = pTemp;
}
//02.区分指针变量和指针:
// 指针变量:含内存块⼉
// ⽤于存储指针的变量
// 指针:不含有内存块⼉
// 是⼀个具有类型含义的地址
/
/ 是⼀个具有类型含义的数值
// 注:使⽤指针变量的实质就是使⽤指针!
int main08(void)
{
int a;
int b;
int * pa = &a, *pb = &b;
//scanf("%d%d", &a, &b);//scanf();函数后⾯所需的是"指针"
scanf("%d%d", pa, pb);
printf("main: &pa = %p, &pb = %p \n", &pa, &pb);
if (*pa > *pb)
{
change02(pa, pb);//间接修改⽆法成功
int temp = a;//直接修改
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论