01****什么是指针?
在C语言中,操作系统屏蔽掉所有硬件存储器,为程序员提供了一个类似数组的内存空间,这个内存空间的基本单位是字节,也是程序员能够操作的基本单位。
指针就是每块基本单位大小的内存的地址,通常被叫做地址或者地址编号。将字节大小的内存分别进行编号,有助于我们对于内存的使用。用来存放指针的变量是指针变量,这也是程序员通常所说的指针。以下所有的指针变量统称为指针。
声明指针的格式:存储类型 指针类型 * 指针名; 举例:
char *p;int *p;
02****存储类型不单独声明时,有两种情况:
情况1: 局部定义指针时,默认为auto类型。表示当进入代码块时,系统为自动变量分配内存。在块内,这些变量被定义,并被认为它是局部于本块的。当退出块时,系统释放分配给自动变量的内存,因此,变量值就丢失了。重新进入块,系统会为自动变量再次分配内存,原先的值已经没有了。
情况2: ****全局定义指针时,默认为extern类型。表示为该变量永久的分配存储,直到当前进程运行结束。全局变量在整个程序执行期间都是存在的。
04号号有两个作用:
作用1: 在定义时,和普通变量做区分,如果没有*号,那就和普通变量的定义格式一致,没有任何区别了;
作用2: 在使用时, *变量名这个形式表示拿到指针保存的地址上的数据。
05****指针名
指针名是一个标识符,要符合标识符的命名规范;注:标识符的命名规范:1. 由数字、字母、下划线组成;2. 不能以数字开头;3. 不能和关键字冲突,严格区分大小写。
**06****指针的大小?
** 指针的大小和类型没有关系 ,和CPU的运行时的寻址位数有关系。 在32位操作系统中,32位CPU一次最大能够访问32位数据,所以指针的大小就是32位,即4字节;在64位操作系统中,64位CPU一次最大能够访问64位数据,所以指针的大小就是64位,即8字节。验证: 使用64位编译器:
linux@ubuntu:~$gcc01test.c
linux@ubuntu:~$./a.outsizeof(char*)=8sizeof(short*)=8sizeof(int*)=8sizeof(long*)=8linux@ubuntu:~$cat01test.c#include<stdio.h>int main(intargc,constchar*argv[]){ printf("sizeof(char*)=%ld\n",sizeof(char*)); printf("sizeof(short*)=%ld\n",sizeof(short*)); printf("sizeof(int*)=%ld\n",sizeof(int*)); printf("sizeof(long*)=%ld\n",sizeof(long*)); return0}
使用32位编译器:
linux@ubuntu:~$gcc01test.c-m32
linux@ubuntu:~$./a.outsizeof(char*)=4sizeof(short*)=4sizeof(int*)=4sizeof(long*)=4linux@ubuntu:~$cat01test.c#include<stdio.h>int main(intargc,constchar*argv[]){ printf("sizeof(char*)=%d\n",sizeof(char*)); printf("sizeof(short*)=%d\n",sizeof(short*)); printf("sizeof(int*)=%d\n",sizeof(int*)); printf("sizeof(long*)=%d\n",sizeof(long*)); return0;}
07****指针类型有什么作用?
由于一个指针只能保存一个地址,一个地址仅仅代表一个字节内存,而通常情况下,程序员定义变量都不不止使用一个字节。**所以如何让指针访问到占有多个字节内存的变量的其他数据,就是通过指针类型。
** 指针类型决定着指针一次能够访问的最大内存空间。举例:
linux@ubuntu:~$./a.outa=0x12345678p=0x7fff5eec899c*p=0x12345678 //当指针类型和指针所保存变量的类型相同时,能够正常获取到变量的数据linux@ubuntu:~$cat01test.c#include<stdio.h>int main(intargc,constchar*argv[]){ inta=0x12345678;//定义一个变量a,保存16进制数0x1234567,总共占4字节 int*p=&a;//定义一个指针,保存变量a的地址 printf("a=%#x\n",a);//#号表示数字前导符,16进制的前导符,是0x,%x表示打印16进制数 printf("p=%p\n",p);//由于指针p中保存的是地址,打印地址用%p printf("*p=%#x\n",*p);//*p表示取到指针保存的地址上的数据,*p<==>a return0;}
这是我们正常使用指针,保证使用的指针类型和保存的数据类型一致,防止数据丢失。以上示例中,指针能够正常取到变量a的4个字节内存上的所有数据。如果将上述示例修改:
linux@ubuntu:~$./a.outa=0x12345678p=0x7ffe4b4f344c*p=0x78 //当指针类型和指针所保存变量的类型不同时,不能够正常获取变量的数据linux@ubuntu:~$cat01test.c#include<stdio.h>int main(intargc,constchar*argv[]){ inta=0x12345678;//定义一个变量a,保存16进制数0x1234567,总共占4字节 char*p=(char*)&a;//定义一个char*类型的指针,保存int类型的变量a的地址,由于类型不一致,编译器会报警告,所以将&a的类型强制转换为char*类型。消除警告; printf("a=%#x\n",a); printf("p=%p\n",p); printf("*p=%#x\n",*p); return0;}