欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言学习

程序员文章站 2022-07-15 09:04:41
...

C语言学习

1.指针

1.1指针数组

  • 指针数组的一般形式
    类型名 * 数组名 [数组长度]

  • 理解
    比较倾向与在字符串数组中使用,节省空间
    个人感觉使用起来和普通数组没什么区别, VC测试代码如下

#include<stdio.h>
int main(void)
{
	int i;
	char *P_array[3]={"pointer","test","hello word"};
	int *P_int[3]={999,1111,3215};

	for(i=0;i<3;i++)
		printf("P_array[%d]指向的字符串:%s\n",i,P_array[i]);

	printf("\n"); 

	for(i=0;i<3;i++)
		printf("指针数组P_array[%d]指向的地址:%x\n",i,&P_array[i]);
	for(i=0;i<3;i++)
		printf("指针数组P_array[%d]指向的地址:%x\n",i,P_array+i);
	printf("\n"); 
	for(i=0;i<3;i++)
		printf("指针数组P_array[%d]指向的地址:%x\n",i,P_array[i]);
		
   	printf("\n"); 

	for(i=0;i<3;i++)
		printf("P_int[%d]指针指向的值:%d\n",i,P_int[i]);

	printf("\n"); 

	for(i=0;i<3;i++)
		printf("指针数组P_s[%d]指向的地址:%x\n",i,&P_int[i]);
	for(i=0;i<3;i++)
		printf("指针数组P_s[%d]指向的地址:%x\n",i,P_int+i);
	for(i=0;i<3;i++)
		printf("指针数组P_s[%d]指向的地址:%x\n",i,P_int[i]);

	return 0;
}

运行结果如下所示

P_array[0]指向的字符串:pointer
P_array[1]指向的字符串:test
P_array[2]指向的字符串:hello word

指针数组P_array[0]指向的地址:19ff20
指针数组P_array[1]指向的地址:19ff24
指针数组P_array[2]指向的地址:19ff28
指针数组P_array[0]指向的地址:19ff20
指针数组P_array[1]指向的地址:19ff24
指针数组P_array[2]指向的地址:19ff28

指针数组P_array[0]指向的地址:422060
指针数组P_array[1]指向的地址:422058
指针数组P_array[2]指向的地址:422070

P_int[0]指针指向的值:999
P_int[1]指针指向的值:1111
P_int[2]指针指向的值:3215

指针数组P_s[0]指向的地址:19ff14
指针数组P_s[1]指向的地址:19ff18
指针数组P_s[2]指向的地址:19ff1c
指针数组P_s[0]指向的地址:19ff14
指针数组P_s[1]指向的地址:19ff18
指针数组P_s[2]指向的地址:19ff1c
指针数组P_s[0]指向的地址:3e7
指针数组P_s[1]指向的地址:457
指针数组P_s[2]指向的地址:c8f
Press any key to continue

按程序执行结果来看跟普通的数组差不多,首先是int*数组,是个一维指针数组,所以&P_int[i] = P_int+i 从运行的结果来看都是P_int[i]的地址;而char *字符串数组本身就是一个二维数组,
&P_array[i] = P_array+i 是P_array[i]字符串的首地址值的存放地址,C语言中指针变量占四字节,这就和上边呼应上了

  • 顺便复习一下堆栈概念
    从打印出的两个数组的地址值来看很容易理解堆栈的概念:局部变更存放在栈,全局变量存放在堆内。
	char a;
	int i;
	char *P_array[3]={"pointer","test","hello word"};
	int *P_int[3]={999,1111,3215};

程序中定义的变量全为