指针强化

多级指针

多级指针案例1

# include <stdio.h>

int main(void)
{
int i = 10;
int * p = &i;  //p只能存放int类型变量的地址
int ** q = &p;  //q是int **类型,所谓int**类型就是指q只能存放int*类型变量的地址,
int *** r = &q;  //r是int***类型, 所谓int***类型就是指r只能存放int ** 类型变量的地址 

//r = &p;  //error 因为r是int *** 类型,r只能存放int **类型变量的地址
    //输出结果是10  只有 ***r才表示的是i, *r或 **r或 ****r代表的都不是i
printf("i = %d\n", ***r); 

return 0;
}

多级指针案列2

#include <stdio.h>

//多级指针在函数中的应用
void fmax(int ** q)
{
**q = 100;//*q就是p
}

void gmin()
{
int i = 10;
int * p = &i;
printf("i = %d  *p = %d\n", i, *p);

fmax(&p); //p是int *类型&p就是int ** 类型

printf("i = %d  *p = %d\n", i, *p);
}

int main(void)
{
gmin();
return 0;
}

静态变量不能跨函数使用

  1. 内存越界:程序访问了一个不该被访问的内存,函数内的静态空间,不能被其他函数调用访问。
  2. 函数中的内存空间,随函数终止而被释放。内存空间释放后的内容不属于其他函数,其他函数无权限访问。但释放后的内存空间的地址是可以被其他函数读取的。
  3. 但指针变量可以存贮任何函数中静态内存空间的地址,p都能存垃圾,p想存谁存谁。只是它此时已经没有权限读取(访问)i这个地址的数据了,出错。

代码示例

# include <stdio.h>

void fmin(int ** q) //q是个指针变量,无论q是什么类型的指针变量,都只占4个字节
{
int i = 5;
//*q等价于p  q和**q都不等价于p
//*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的
*q = &i;  // p = &i;
}

int main(void)
{
int *p;  

fmin(&p);
printf("%d\n", *p);  // 本语句语法没有问题,但逻辑上有问题

return 0;
}

动态内存可以跨函数使用案例

# include <stdio.h>
# include <malloc.h>

void fmax(int ** q) //*q等价p 已经声明了q的类型为int **
{
*q = (int *)malloc(sizeof(int)); //sizeof(数据类型) 返回值是该数据类型所占的字节数
//等价于 p = (int *)malloc(sizeof(int));
//q = 5; //error
//*q = 5; //p = 5;
**q = 5; //*p = 5;
}

int main(void)
{
int * p;

fmax(&p);    //只有调用变量的地址,才能改变变量的值
printf("%d\n", *p);  

//fmax函数中,没有free(q);所以动态空间仍然保留,动态空间中的内容可以被访问
return 0;
}
(0)

相关推荐