zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言入门之指针(4)

C语言入门 指针
2023-09-14 09:16:39 时间
  • 指针的小结

  1. 首先要准确地弄清楚指针的含义。指针就是地址,凡是出现“指针”的地方,都可以用“地址”代替,例如,变量的指针就是变量的地址,指针变量就是地址变量
  2. 要区别指针和指针变量。指针就是地址本身,而指针变量是用来存放地址的变量。

void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。无论用哪种转换,读者必须了解要进行类型转换

3.要深入掌握在对数组的操作中怎样正确地使用指针,搞清楚指针的指向。一维数组名代表数组首元素的地址

 int *p,a[10];

   p=a;

p是指向int类型的指针变量,p只能指向数组中的元素,而不是指向整个数组。在进行赋值时一定要先确定赋值号两侧的类型是否相同,是否允许赋值。

对“p=a;”,准确地说应该是:p指向a数组的首元素

4.指针运算

      (1)指针变量加(减)一个整数

例如:p++,p--,p+i,p-i,p+=i,-=i等均是指针变量加(减)一个整数。

将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。

(2)指针变量赋值

  1. 将一个变量地址赋给一个指针变量
  2. 不应把一个整数赋给指针变量

(3) 两个指针变量可以相减

如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数

(4) 两个指针变量比较

  1. 若两个指针指向同一个数组的元素,则可以进行比较
  2. 指向前面的元素的指针变量“小于”指向后面元素的指针变量
  3. 如果p1p2不指向同一数组则比较无意义

(5) 指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:

    p=NULL;

5.指针为NULL时不能引用,引用将会出现

   漰溃,例如: char *p = NULL;

                   char a = *p;

  • 指针加1或减1,所指向的地址移动的大小与指向的对象有关。

 1.字符指针加1或减1,将移动1个字节的地址

2.短整型指针加1或减1,将移动2个字节的地址

3.整型,长整型,单精度浮点型指针加1或减1,将移动4个字节的地址

4.双精度浮点型指针加1或减1,将移动8个字节的地址

5.其它自定义数指针加1或减1,将移动一个自定义数据长度的地址

解决办法:三步曲

1、定义指针时,把指针变量赋值成NULL

2、释放内存是,先判断指针变量是否为NULL

3、释放完内存后,把指针变量重新复制成NULL

  • 函数调用的时候,这个场景修改不了实参

int FreeMem1(char *p)

if (p == NULL)

  return -1;

if (p != NULL)

{

  free(p);

  p =NULL;//只是把形参重置为NULL,但是实参并没有改变

}

return 0;

     }

解决FreeMem1释放空间指针不能重置问题

int FreeMem2(char **p) {   //实参地址传过来了

if (*p == NULL)

return -1;

if (*p != NULL) {

  free(*p);

  *p =NULL;//把实参重置为NULL,不会产生野指针

}    

return 0;

}

常量指针和指针常量

  1. const int * p1;   //指向的对象是常量
  2. int  const *p2;  //指针本身是常量
  3. const int const *p3; //指针本身是

        //常量且指向的对象是常量

*p1=8;//错误   p1++; //正确

*P2 = 8;//正确  p2++; //错误

        *P3 = 8;//错误  p3++; //错误

指针数组和数组指针

  1. int *p1[4];  //是一个数组,有4个指针元素
  2. int (*p2)[4]; //是一个指针,指向一个有4个元素的一维数组                 

指向指针的指针

     int a = 10; int *p3 = &a;    

     int **p4 = &p3;  //是一个二维指针,指向另一个指针p3

 

函数指针

例如:

int *(*func)(int (*f)(int *x,int *y));

函数类型为:int*

函数指针名为:func

函数指针的参数是另一个函数指针int (*f)(int *x,int *y)