16、C语言指针小结

来源:互联网 发布:mac在美国多少钱一支 编辑:程序博客网 时间:2024/04/30 15:55

指针

内存中的每一个存储单元(一个字节,或则一个字,这主要视机器系统而别,有时候一个字等于四个字节,有时候等于一个字节),都有一个整数类型的编号,这个编号就是地址,也

就是指针。

指针在赋值时,切记需要基类型相同

一、存储单元的内容和存储单元的地址。

数据类型其实就是指明一个数据占用的字节数,那么系统在取这个变量的值的时候,

就可以根据首地址,和占用字节数,将这个变量的值完整的取出来。

指针变量:如果有一个变量专门用来存放另一个变量的地址,则称它为指针变量,

指针变量的值是地址。

所有指针变量所占的字节数相等:sizeof(int),因为地址就是整数。

声明一个指针变量时,必须有数据类型,这样才能通过始地址及存储单元的长度

正确地取出该数据。

注意:指针变量只能存放地址,不能将一个整数(或者字符)赋给一个指针变量。

一个指针变量在使用前,一定要进行初始化,否则它指向的内存单元不可知。

对它操作时,有可能会破坏系统中的原有有效数据。

不可能通过调用函数来改变实参指针变量的值,但可以改变指针变量指向的变量

的值。

二、一维数组及指针

一维数组的数组名相当于数组首元素的首地址。

如:int a[10];  a相当于&a[0];

int *p=a;

p++;p--;移动一个元素所占的字节数。

注意:a是常量 ,不可以改变其值。

用数组名作实参是地址传递,形参数组名,是变量,可改变其值。

三、多维数组及指针

如二维数组,可以看成是由多个一维数组组成的一维数组。

int a[3][4];

二维数组名代表的是首行(第一个一维数组)的首地址,并不是首元素的地址。

a=&a[0]; 而不是 &a[0][0]

*(*(a+1)+1)才是a[1][1]

一个二维数组int a[n][m]

&a[i][j]==a+i*m+j 相等。

指针:指向由m个元素组成的一维数组的指针变量

int (*p) [4];  相当于  int [4]  *p; 基类型是 一个由四个元素组成的一维数组。

int a[3][4];

int b[4];

int *p1;

p=a;不可以p=a[0]; 使用时如同二维数组名

p1=a[0];

p=&b;这样使用才是正确的

p1=b;

//指针在赋值时,切记需要基类型相同,比如p1=a;这就是犯错误的,因为

p1是一个整数的值,而a是首行的首地址,也就是相当于&b;

示例程序:

#include #include int main(){    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};    int b[4]={13,14,15,16};    int *p1;    int i=0;    int (*p2) [4];    p1=a[0];    p2=a;    for(i=0;i<3;i++)    {        int j=0;        for(;j<4;j++)        {            printf("a[%d][%d]=%d\n",i,j,*(*(a+i)+j));            printf("a[%d][%d]=%d\n",i,j,*(p1+i*3+j));            printf("a[%d][%d]=%d\n",i,j,*(*(p2+i)+j));        }    }    return 0;}


四、字符数组及字符指针,以及指针数组

字符指针,存储的是字符串第一个字符的首地址,

如:char *p=”CHINA”;

而且字符指针变量指向的字符常量中的内容不可取代。

p[2]=’B’;//错误

char b[]=”CHINA”;

b[2]=’A’;//正确

但是可以改变指针的指向,字符数组则不可以,因为字符数组名是一个常量。

 

char * c[4];

这是字符指针数组,由四个指向字符串的指针组成。

五、指向函数的指针

用来存放某一函数的起始地址。

声明这样的指针时,只需要将平常声明函数的函数名称,换成 (*指针名) 便可,

调用时也是同样的替换。但是指针只能指向相同原型的函数

int  (*p)   (int,int); 基类型是 int (int ,int) 的 (*p)指针。

int max(int,int);

p=max;//函数名其实就是函数首地址。

一般用于不固定调用某个函数时使用。

注意:切记函数不可返回,内存单元在出了函数后就被收回的变量地址。

多重指针 int **p;

指针数组 int *p [4];


原创粉丝点击