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;
}

静态变量不能跨函数使用

  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;
}
posted @ 2020-05-17 14:16  guardwhy  阅读(179)  评论(0编辑  收藏  举报