第26课 指针的本质分析

*号的意义
·在指针声明时,*号表示所声明的变量为指针
·在指针使用时,*号表示取指针所指向的内存空间中的值函数

例子:
#include"stdio.h"
int main()
{指针

int i = 5; 
int *p =&i;
printf("%d,%p\n",i,p);
*p = 10;   
printf("%d,%p\n",i,p);
return 0;

};
输出结果:
5,00EFFEA40
10,00EFFEA4code

指针也是变量,变量就有地址,指针也能够取地址内存

变量P保存着变量i的内存地址,即:
p→&i
*p→iio

例子26-1:变量

include"stdio.h"

int main()
{数据类型

int i = 0;
int* pI;
char* pC;
float* pF;

pI = &i;
*pI = 10;
printf("%p,%p,%d\n",pI,&i,i);
printf("%p,%p,%d\n",sizeof(int*),sizeof(pI),&pI);
printf("%p,%p,%d\n",sizeof(char*),sizeof(pC),&pC);
printf("%p,%p,%d\n",sizeof(float*),sizeof(pF),&pF);
return 0;

};
输出结果:
0056F808,0056F808,10
00000004,00000004,5699580
00000004,00000004,5699568
00000004,00000004,5699556
指针变量只须要4个字节的变量存取,并且int char float 类型的指针变量都是4个字节float

传值调用与传址调用
·指针是变量,所以能够声明指针参数
·当一个函数体内部须要改变实参的值,则须要使用指针参数
·函数调用时实参值将复制到形参
·指针适用于复杂数据类型做为参数的函数中
例子26-2:error

include"stdio.h"

int swap(int a,int b)
{数据

int c = a;
a = b;
b = c;

}
int main()
{

int aa = 1;
int bb = 2;
printf("aa = %d,bb = %d\n",aa,bb);
swap(aa,bb);
printf("aa = %d,bb = %d\n",aa,bb);
return 0;

}
输出结果:
aa = 1,bb = 2
aa = 1,bb = 2
函数分析:输出结果没有变化是由于swap(aa,bb);将值给了a,b,并无参与运算,只是简单的传值调用。

改26-2:

include"stdio.h"

int swap(int a,int b)
{

int c = *a;
*a = *b;
*b = c;

}
int main()
{

int aa = 1;
int bb = 2;
printf("aa = %d,bb = %d\n",aa,bb);
swap(&aa,&bb);
printf("aa = %d,bb = %d\n",aa,bb);
return 0;

}
输出结果:
aa = 1,bb = 2
aa = 2,bb = 1
函数分析:
传址调用,传的是地址,就能改变aa,bb的地址。

常量与指针
·const int* p; //p可变,p指向的内容不可变
·int const* p; //p可变,p指向的内容不可变
·int* const p; //p不可变,p指向的内容可变
·const int* const p //p不可变,p指向的内容不可变
口诀:左数右指
当const出如今*号左边时指针指向的数据为常量
当const出如今*后右边时指针自己为常量

例子26-3:

include"stdio.h"

int main()
{

int i = 0;
const int* p1 = &i;
int const* p2 = &i;
int* const p3 = &i;
const int* const p4 = &i;

*p1 = 1;  //error
p1 = NULL;

*p2 = 1;  //error
p2 = NULL;

*p3 = 1;
p3 = NULL; //error

*p4 = 1;   //error
p4 = NULL; //error

}小结:·指针是C语言中一种特别的变量·指针所保存的值是内存的地址·能够经过指针修改内存中的任意地址内容

相关文章
相关标签/搜索