内容介绍:
一、指针与指针变量
二、取址运算符和取值运算符
一、 指针与指针变量
1、指针是c语言的精髓部分,没有指针就没有现在简洁紧凑高效的c语言,作为学习者,对指针的掌握程度直接决定对C语言的编程能力。
2、定义指针变量
1)、如果在程序中定义一个变量,那么在程序进行编译的时候,就会根据这个变量的类型在系统中分配对应的长度的空间,通过变量名来访问变量。
2)、通过变量名来访问内存是一个相对较安全的方式,只有定义了变量,才能访问它,这是对内存最基本的认知。
类型名*指针变量
char *pa; //定义一个指向字符型的指针变量
int *pb; //定义一个指向整型的指针变量
要注意不同类型所占空间大小不同,如果指定错误,那么访问时就会出错
指针就是地址的意思,指针变量是存放一个地址,普通变量就是存放一点数据,指针的类型就是存放数据的类型
编译器知道每个地址存放的值,一个地址4个字节,在内存中的值是一个地址
地址称之为指针,而这个存放的值称之为指针变量
数据在内存中如何存取
在程序中定义一个变量,程序编译时,系统就会根据编译类型在
程序内存中分配对应强度的空间,通过变量名进行访问
内存存储数据:
内存索引单元最小是一个字节,可以想象成一个大型数组,数组有索引下标,内存中称为地址
4个存储单元存储一个整型变量,每个存储单元有一个地址,整形变量就相当于4个字节,变量名是根据程序员的使用而定义的,这就是内存存储数据的真相
只有编译器知道:
a -> 10000
b -> 10001
c -> 10002
d -> 10003
e -> 10004
f-> 10005
g ->10009
想要f的值,就去读取f的地址10005
二、 取址运算符和取值运算符
如果需要获取某个变量的地址,可以使用取地址运算符((&):
char *pa= &a;
int *pb = &f;
*pa=3,称之为间接访问,
如果需要访问指针变量指向的数据,可以使用取值运算符(*):
直接通过变量来访问,称为直接访问,例如:a=3,就可以直接访问a的值。
printf("%c, %d\n", *pa,*pb);
案例:
#include <stdio.h>
int main()
{
//定义两个普通变量
char a ='F';
int f =123;
//定义两个指针变量,*代表指针变量
char *pa = &a;//其中地址类型为char类型
int *pb = &f ;//f指向整型
//取pa的值,pa为指针名字
printf("a = %%c\n", *pa);
printf("f =%d\n"",*pb);
return 0;
}
运行gcc test.c && ./a.out
结果:
a = F
F = 123
间接访问案例:
#include <stdio.h>
int main()
{
char a ='F';
int f =123;
char *pa = &a;
int *pb = &f ;
//取pa的值,*为
printf("a = %%c\n", *pa);
printf("f =%d\n"",*pb);
//通过指针间接访问
*pa = 'c';
pb +=1;
printf("now, a = %c\n", pa) ;
printf("now, f = %d\n",*pb);
return 0;
}
运行gcc test.c && ./a.out
结果:
a = F
F = 123
now,a=C
now,f=124
这就是间接访问
sizeof案例:
#include <stdio.h>
int main()
{
char a ='F';
int f =123;
char *pa = &a;
int *pb = &f ;
//取pa的值,*为
printf("a = %%c\n", *pa);
printf("f =%d\n"",*pb);
//通过指针间接访问
*pa = 'c';
pb +=1;
//打印*pa为地址存放的值
printf("now, a = %c\n", *pa) ;
printf("now, f = %d\n",*pb);
printf( "sizeof pa =%d\n"", sizeof( pa));
printf("sizeof pb =%d \n", sizeof ( pb ) ) ;
printf( "the addr of a is : %p\n", pa) ;
printf ("the addr of b is : %p\n", pb) ;
return 0;
}
运行gcc test.c && ./a.out
结果:
a = F
F = 123
now,a=C
now,f=124
sizeof pa
sizeof pb
the addr of a is :0xbf9eff17
the addr of b is :0xbf9eff10
0x开头占16个字节
注意:避免访问未初始化的指针
这就是未初始化的指针
#include <stdio.h>
int main( )
{
//定义的一个整型指针,但是并没有分配值,内存就是随机的值
int *a;
//程序终止并且报错
*a = 123;
return 0;
}
这种类似的问题是很难排查的。因为从语法上是正确的,但是这个代码又会得到意想不到的结果,所以必须确保他们被初始化了。
下图这种 就是错误的。