C语言-指针强化
多级指针
多级指针案例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;
}
静态变量不能跨函数使用
- 内存越界:程序访问了一个不该被访问的内存,函数内的静态空间,不能被其他函数调用访问。
- 函数中的内存空间,随函数终止而被释放。内存空间释放后的内容不属于其他函数,其他函数无权限访问。但释放后的内存空间的地址是可以被其他函数读取的。
- 但指针变量可以存贮任何函数中静态内存空间的地址,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;
}