指针被称为C语言的精华,真正理解和掌握指针是征服C语言的关键!在学习指针之前,我们先弄清了概念。
地址
地址是什么?在内存(注:我们这里提到的内存不是人们常说的计算机的物理内存,而是虚拟逻辑内存空间)中,地址是能够唯一识别一个点的数字,即数字!我们都见过尺子。我们统一以毫米为单位、长度为1000毫米的尺子,其范围为0~999,我们可以准确地找到35毫米、256毫米的位置。
出于同样的原因,内存也像统治者一样线性排列,但这个范围有点大。在我们使用最广泛的32位操作系统中,地址在0~4,294,967,295之间,地址只是其中之一,习惯上,在计算机内,地址是我们经常使用的。(大卫亚设,Northern Exposure(美国电视))C程序中定义的每个变量都在内存中占用内存单元。例如,int类型为4字节,char类型为1字节,依此类推。每个字节在0到4,294,967,295之间有相应的编号。c语言可以在程序中使用变量地址。
# include
Intmain()
{
因蒂;
Inta[10]={1,2,3,4,5,6,7,8,9,0 };
Charb [10]={'c ',' l ',' a ',' n ',' g ',' u ',' a ',' g ',' e '
for(I=0;I10I)
{
Printf ('int address 33600x% x,value 3360% d \ n ',a [I],a[I]);
}
printf(' \ n ');
for(I=0;I10I)
{
Printf ('char address 33600x% x,value 3360% c \ n ',b [I],b[I]);
}
Return0
}
在32位Linux系统上运行参考结果:
Int address 33600 xbfb 949c4,值33601
Int address 33600 xbfb 949c8、value :2
Int address 33600 xbfb 949cc、value :3
Int address 33600 xbfb 949d0、value 33604
Int address 33600 xbfb 949d4、value :5
Int address 33600 xbfb 949d8、value 33606
Int address 33600 xbfb 949dc、value 33607
Int address 33600 xbfb 949e0、value :8
Int address 33600 xbfb 949e4、value :9
Int address 33600 xbfb 949e8、value :0
Char address 33600 xbfb 949f2、value :c
Char address 33600 xbfb 949f3、value :l
Char address 33600 xbfb 949f4、value :a
Char address 33600 xbfb 949f5、value :n
Char address 33600 xbfb 949f6、value :g
Char address 33600 xbfb 949f7、value :u
Char address 33600 xbfb 949f8、value :a
Char address 33600 xbfb 949f9、value :g
Char address 33600 xbfb 949fa,值3360e
Charaddress 33600 XBFB 949FB、VALUE 3360直接在飞机上运行测试并观察分析结果。
指针的定义和使用
理解地址的概念后,指针也不奇怪。简单地说,地址是逻辑内存中的号码,指针是号码和地址。但是两者的性质不同。一个代表常数,另一个是变量。就像记忆是统治者一样,指针是椅子上的光标,可以左右移动。他在某个时间点指向一个地方。这就是指针变量。(大卫亚设)。
为指针变量定义的常用格式为:
类型指示符*变量名;
其中*与前面的类型说明符一起说明这是指针变量。类型说明符表示该指针变量指向的变量的数据类型,变量名是定义的指针变量名。此外,c提供*运算符,以获取地址的相应值。
例如:
# include
Intma
in() { int num=2014; int *p=# printf("num Address = 0x%x,num=%d\n",&num,num); printf("p = 0x%x,*p=%d\n",p,*p); printf("%d\n",*&num); return 0; }请亲自运行观察结果并思考。
值得一提的是,由于指针存放的都是地址,在32位操作系统下都在0 ~ 4,294,967,295这个数区间内,所以:在32位操作系统下,任何类型的指针变量都占四个字节!
#include<;
struct INFO
{
int a;
char b;
double c;
};
int main()
{
int *p;
char *p1;
float *p2;
double *p3;
struct INFO *p4; //struct INFO类型为结构体类型 我们将会在后面的章节中讲解
void *p5;
printf("int point size is :%d\n",sizeof(p));
printf("char point size is :%d\n",sizeof(p1));
printf("float point size is :%d\n",sizeof(p2));
printf("double point size is :%d\n",sizeof(p3));
printf("struct point size is :%d\n",sizeof(p4));
printf("void point size is :%d\n",sizeof(p5));
return 0;
}
#上机运行观察结果
数组与指针
前面我们已经知道,通过数组下标可以确定数组元素在数组中的顺序和存储地址。
由于每个数组元素相当于一个变量,因此指针变量可以指向数组中的元素,也就是说可以用指针方式访问数组中的元素。
对一个指向数组元素的指针变量的定义和赋值方法,与指针变量相同。例如:
int a[10]; /*定义 a 为包含 10 个整型数据的数组*/
int *p; /*定义 p 为指向整型变量的指针*/
p=&a[0]; /*把 a[0]元素的地址赋给指针变量 p*/
C 语言规定,数组名代表数组的首地址,也就是第 0 号元素的地址。因此:
p=a; /*等价于 p=&a[0]; */
int *p=a; /*等价于 int *p=&a[0]; */
对于指向首地址的指针 p,p+i(或a+i)就是数组元素 a[i]的地址,*(p+i)( 或*(a+i) )就是 a[i]的值。
如果指针变量 p 已指向数组中的某一个元素,则 p+1 指向同一数组中的下一个元素。
引入指针变量后,就可以用以下两种方法来访问数组元素:
(1)下标法:即用 a[i]形式访问数组元素,在前面介绍数组时都是采用这种方法。
(2)指针法:即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中 a 是数组名,p 是指向数组的指针变量,其初值 p=a。
#include<;
int main()
{
int i;
int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p=a;
for(i=0;i<10;i++)
{
printf("P Value:%d a Value :%d\n",*(p++),*(a+i));
}
printf("\n");
return 0;
}
注意输出的两种方式,指针可以通过++或--并修改自身值的方式移动,然而数组名本身值不可以被更改。
字符串与指针
前面我们已经讨论过字符数组与字符串,字符指针也可以指向一个字符串,可以用字符串常量对字符指针进行初始化。例如:
char *str = "www.do; ;
这是对字符指针进行初始化。此时,字符指针指向一个字符串常量的首地址。
还可以用字符数组来存放字符串,例如:
char string[ ] = "Welcome to do;
在这个语句中,string 是数组名,代表字符数组的首地址。
因此可以通过数组名 string 来访问字符串,字符串指针和字符串数组两种方式都可以访问字符串。
但它们有着本质的区别:字符指针str 是个变量,可以改变str 使它指向不同的字符串, 但不能改变 str 所指向的字符串常量的值。 而string 是一个数组,可以改变数组中保存的内容。应注意字符串指针和字符串数组的区别。
#include<;
int main()
{
char *str = "www.do;;
char string[]="Welcome to do;;
str[0]='C'; //试图修改str指向的常量区的字符串内容
return 0;
}
指针是C语言的精髓所在,需要深入理解的同时可以熟练运用指针在不同场合,当然离不开作业的练习,可以把之前的数组相关的题库用指针来实现。
关于指针讲解的视频部分已上传,需要的伙伴可自行观看~
需要学习资料的伙伴可以私信我领取噢~
1.《【0号元素】电脑期末不知道怎么复习?献上复习总结:指针大战》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【0号元素】电脑期末不知道怎么复习?献上复习总结:指针大战》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/2572862.html