嵌入式linux C 之指针

2019-07-12 20:05发布

1、指针变量:就是用来存放指针(地址)的变量,它的值是地址,也可以这样理解,指针的实质就是地址。 2、指针数组:若数组的元素都是地址那么这个数组就是指针数组。例如:int *p[4]={ &a[0],&a[1],&a[2],&a[3] }; 又例如:char *name[2]={ " I am is "," perfact" }; 那么name[0]="I am is" ;  name[1]="perfact" ;   在这里数组存放时字符串的首地址。 3、数组指针:数组在内存中的起始地址称为: 数组指针。例如:int name[10],*p=name;  那么 p+i 和a+i,都是指向数组元素a[i]的地址。例如:int (*p)[4]  也就是二维数组 例如;如果有int a[2][3]={ { 1,2,3 }, { 2,3,4} };则下面的含义为:

4、字符串的表现形式:  一种是数组,一组是字符指针 char  str[10]=" I am perfacts "; char *string=" I am perfact"; 赋值方式: char  str[40]; str==" Efforts will be successful "; char *string=NULL; string=Efforts will be successful";
5、函数的指针:一个函数在编译的时候被分配的一个口地址,这个地址就称为:函数的指针 例如: int (*p)(int ,int );    //指向函数指针变量的定义形式 p=min; //将函数的入口地址赋给函数指针变量p c=min(a,b);  //调用min函数 注意;(1)int (*p)( )就是定义一个指向函数的指针变量p,p不是固定指向哪个函数 (2)在程序中把那个函数的入口地址赋给它,它指向那个函数 例如: void show( int(*fun)(int*,int*,int*),int arg1, int *arg2)
6、返回指针值的函数: 返回来的值是指针类型而已。 其定义形式为:int * a ( int x,int y)

7、如果int a=100,*p=&a;则以下代表什么含义?
(1)   *p        100
(2)   &*p       =p
(3)  *p++      100     在当前的表达式可写成  a=*p++;  其结果出来后a=100,此时p开始指向下个地址
(4)  (*p)++    101
9、指针数组和数组指针记忆 指针数组:数组里面存放的是指针(地址),即一维数组, 例如: char*name [2] = { "hai" , "hello" };   int   *p[4]={ &a[0] , &a[1] }; 数组指针:指针里面存放的是数组,即二维数组, 例如:int a[3][4]={  {1,2} , {3,5} , {6,3} };   int (*p)[4]=a;
10、要搞清楚一个指针需要高清指针的四方面的内容:指针的类型指针所指向的类型指针的值或者叫指针所指向的内存区、指针本身所占据的内存区


(1)指针的类型
从语法的角度看,你只要把指针声明语句的指针名字去掉,剩下的部分就是这个指针的类型,这时指针本身所具有的类型。
  1) int *ptr ;  //指针的类型是 int*
  2) int *(*ptr)[4];    //指针的类型是 int *(*ptr)[4]
  3)   int (*ptr)[3]     // 指针的类型是int(*)[3]


(2)指针所指向的类型
    从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型  例如:
  1)int *ptr;    //指针所指向的类型是 int
  2)int **ptr;   //指针所指向的类型是 int*
  在指针的算术运算中,指针所指向的类型有很大的作用,指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。
(3)指针的值——或者叫指针所指向的内存区或地址
  指针的值是指针本身存储的数值,这个值将被编译器当做一个地址,而不是一个一般的数值,在32位程序里,所       有的类型的指针的值都是一个32位的整数,因为32位程序里内存地址全都是32位长.指针所指向的内存就是从指针  的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区   。
(4)指针本身所占据的内存区
   指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。 在32为的平台里,指针本身占据了4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值是很有用。


4、sizeof(对象):例如:
int  array[10];
int (*ptr)[10];
ptr=&array;

本例程中,ptr是一个指针,它的类型是 int(*)[10],  它所指向的类型是int[10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。
sizeof(指针名称)测出的是指针自身类型的大小。
在32位机子中,有:
sizeof ( int(*)[10] ) ==4
sizeof ( int[10] ) ==40
sizeof ( ptr ) ==4



void ss(char *s,char t)
{
while(*s)         // 好处就在这里     可以单独的访问字符串的每个字符
{
if( *s==t )
*s=t-'a'+'A';
s++;
}
}
main()
{
char str1[100]="abcddfefdbd", c='d';
ss(str1,c);
printf("%s ",str1);
}


输出结果:abcDDfeDbD