16、C语言指针小结
2013-06-06 18:15
369 查看
指针
内存中的每一个存储单元(一个字节,或则一个字,这主要视机器系统而别,有时候一个字等于四个字节,有时候等于一个字节),都有一个整数类型的编号,这个编号就是地址,也
就是指针。
指针在赋值时,切记需要基类型相同
一、存储单元的内容和存储单元的地址。
数据类型其实就是指明一个数据占用的字节数,那么系统在取这个变量的值的时候,
就可以根据首地址,和占用字节数,将这个变量的值完整的取出来。
指针变量:如果有一个变量专门用来存放另一个变量的地址,则称它为指针变量,
指针变量的值是地址。
所有指针变量所占的字节数相等: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
[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;
示例程序:
四、字符数组及字符指针,以及指针数组
字符指针,存储的是字符串第一个字符的首地址,
如: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];
内存中的每一个存储单元(一个字节,或则一个字,这主要视机器系统而别,有时候一个字等于四个字节,有时候等于一个字节),都有一个整数类型的编号,这个编号就是地址,也
就是指针。
指针在赋值时,切记需要基类型相同
一、存储单元的内容和存储单元的地址。
数据类型其实就是指明一个数据占用的字节数,那么系统在取这个变量的值的时候,
就可以根据首地址,和占用字节数,将这个变量的值完整的取出来。
指针变量:如果有一个变量专门用来存放另一个变量的地址,则称它为指针变量,
指针变量的值是地址。
所有指针变量所占的字节数相等: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
[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];
相关文章推荐
- iOS之C语言指针,数组小结
- C语言中的指针参数传递小结 (2005-7-5)
- 【C语言】【指针相关知识小结】
- C语言小结--指针和变量传参
- C语言中关于指针的数据类型和指针运算的小结
- c语言-数组/指针/函数(小结)
- 黑马程序员——C语言之指针常用方法小结
- C语言指针小结
- c语言指针问题小结
- C语言指针使用小结
- C语言中指针和字符串中的一些小结
- C语言学习笔记 lesson15&16 函数2指针的偏移
- 【C语言提高16】数组中括号与指针关系和数组名常量指针分析
- C语言及程序设计进阶例程-16 当结构体成员为指针
- C语言指针使用小结
- 【C语言】【指针相关知识小结】
- C语言中指针的数据类型小结
- C语言关于数组与指针内容小结
- C语言数组名及指向数组指针的小结
- C语言中关于数组与指针和字符串与指针的小结