【C语言】指针Pointer初阶(2)-创新互联

目录

创新互联专业为企业提供和龙网站建设、和龙做网站、和龙网站设计、和龙网站制作等企业网站建设、网页设计与制作、和龙企业网站模板建站服务,10多年和龙做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

1.指针与数组

1.1一维数组:

//利用指针访问一维数组

1.2二维数组:

//用指针模拟一个3行4列的数组

// 利用二维数组的行地址和列地址访问二维数组

1.3数组指针

//利用数组指针访问二维数组 

2.指针和字符串

//利用字符指针复制字符串

//利用字符指针反转字符串

3.指针数组

//利用字符指针数组将五门课程名按字典顺序排序输出


1.指针与数组

区别:指针和数组是不同的对象。指针是一种变量,用来存放地址,大小固定,为4个或8个;数组是一组相同类型元素的结合,是可以放多个元素的,大小是取决于元素个数和元素类型的;

联系:数组的数组名 arr 是数组起始元素的地址(注意不要和数组的首地址 &arr 混淆),地址是可以放在指针变量中的,可以通过指针访问数组。

1.1一维数组:

这里先拓展一下指针与一维数组的关系:

已知 int arr [ 10 ]  ; int *  p = arr ;

则 arr [ i ]  = p [ i ] =  * ( p + i ) = * ( arr + i ) ;

这些完全等价,但是技多不压身嘛,多会几种总是好的。

//利用指针访问一维数组
int main()
{
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int i = 0;
    int* p = arr;//起始p指向arr中第一个元素,即首地址
    for (i = 0; i< 10; i++)
    {
        printf("%d ", *(p + i));
    }
    return 0;
}

来看看一维指针数组是啥样的(这里涉及到了指针数组的概念,在老下面会讲到)~

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = 40;
	int e = 50;
	int* arr[5] = { &a,&b,&c,&d,&e };
	int i = 0;
	for (i = 0; i< 5; i++)
	{
		printf("%d ", *(arr[i]));
	}
	return 0;
}

1.2二维数组:

二维数组名是二级指针常量(行指针)。

设有 arr [3][5] = {"1234","5678","ABCD"}; 则:

arr [ i ] + 0arr [ i ] + 1arr [ i ] + 2arr [ i ] + 3arr [ i ] + 4
arr + 0

arr [0][0]

arr [0][1]arr [0][2]arr [0][3]arr [0][4]
arr + 1arr [1][0]arr [1][1]arr [1][2]arr [1][3]arr [1][4]
arr + 2arr [2][0]arr [2][1]arr [2][2]arr [2][3]arr [2][4]

行:地址:arr + i = &arr [i]

 元素:arr [i] = *(arr + i)

列:地址:arr [i] + j = *(arr + i) + j

 元素:arr [i][j] = *(*(arr + i) + j) = *(arr [i] + j) = (*(arr + i)) [j] 

//用指针模拟一个3行4列的数组
int main()
{
	int a[] = { 1,2,3,4 };
	int b[] = { 2,3,4,5 };
	int c[] = { 3,4,5,6 };
	int* arr[3] = { a,b,c };
	int i = 0;
	for (i = 0; i< 3; i++)
	{
		int j = 0;
		for (j = 0; j< 4; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
// 利用二维数组的行地址和列地址访问二维数组
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
    int arr[3][3];
    int i = 0, j = 0;
    printf("请输入数组:\n");
    for (i = 0; i< 3; i++)
    {
        for (j = 0; j< 3; j++)
        {
            scanf("%d", *(arr + i) + j);//这里是地址不是元素!!!
        }
    }
    printf("打印的数组为:\n");
    for (i = 0; i< 3; i++)
    {
        for (j = 0; j< 3; j++)
        {
            printf("%d ", *(*(arr + i) + j));//这里是元素不是地址!!!
        }
        printf("\n");
    }
    return 0;
}
1.3数组指针

C语言允许定义一个指向一维数组的指针变量——行指针变量,又称数组指针。

格式:type(*数组指针变量名)[一维数组长度]

例如:int(*ptr)[ 3 ] 定义了一个指向3个连续存放的整型数的内存首地址的数组指针。

二维数组中 arr + 1 和 arr [1] 的区别:

1>arr +1 是一个行指针(二级指针),指向内存中连续5个数据 arr [1][0],arr [1][1],arr [1][2],arr [1][3],arr [1][4];

2>arr [1] 是一个列指针(一级指针),arr [1] = *(arr + 1)= &arr [1][0]。 

//利用数组指针访问二维数组 
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	int i = 0, j = 0;
	int(*p)[3] = arr;//指向arr数组的第一行的3个元素, 此时p相当于 &(arr+0)——行指针(二级)
	for (i = 0; i< 3; i++, p++)                       //注意不是&arr[0]=arr[0][0]——列指针(一级)
	{
		for (j = 0; j< 3; j++)
		{
			printf("%d", (*p)[j]);//p相当于&(arr+i),*p相当于 arr+i 即 arr[i]
		}
		printf("\n");//换行后 p++,指向第二行的3个元素
	}                //……
	return 0;
}

2.指针和字符串

一级字符型指针定义方法:char* 一级字符指针变量名;

一开始指向的是字符串在内存中的起始地址,后续使用时还可能指向其他地方。

例如:char* str1 = "C program";
 char string[] = "China";
 char* str2 = string;

字符指针变量 str 与字符数组 string 的区别:

1>存储内容不同:str 是地址变量,string 是地址常量,都指向 &string[0],但str可变;

2>存储空间长度不同:字符数组长度确定,尾部空间可能闲置,而字符指针变量占用字节数是地址所需长度,与字符串长度无关;

3>赋值方式不同:字符数组定义时可直接初始化,也可利用strcpy赋值,但不能直接赋值,而字符指针变量既可以定义时初始化,也可以稍后直接赋值;

4>接受输入不同:字符数组可以直接接受输入,字符指针变量接受输入的字符串之前要事先指向一段内存存储空间,否则会变成野指针;

5>运算不同:字符数组名是地址常量,不能改变指向,字符指针变量可以参加指针运算,改变指向。

//利用字符指针复制字符串
int main()
{
	char arr1[20];
	char arr2[20];
	printf("请输入一个字符串:");
	gets(arr1);
	char* p1 = arr1;
	char* p2 = arr2;
	while (*p1)
	{
		*(p2) = *(p1);
		p2++;
		p1++;
	}
	*p2 = '\0';//最后放个字符串结束符,否则会出现乱码
	printf("复制后的字符串为:");
	puts(arr2);
	return 0;
}

//利用字符指针反转字符串
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
	char arr[20];
	printf("请输入一串字符串:");
	gets(arr);
	char* begin = arr;
	char* end = arr;
	while (*end)//知道找到最后一个元素的地址
	{
		end++;
	}
	end--;
	int tmp = 0;
	while (begin< end)//指针比较
	{
		tmp = *begin;
		*begin = *end;
		*end = tmp;
		begin++;
		end--;
	}
	printf("翻转后的字符串为:");
	puts(arr);
	return 0;
}

3.指针数组

结构:char* 指针数组名 [ 数组长度 ] ;

指针数组与二维数组的区别:

指针数组中的每一个元素所指向的一维数组长度可以不同,一维数组之间也不需要在内存中连续存放;指针数组中的每一个元素均为指针变量,地址可变;数组指针是一个二级指针变量;指针数组名与二维数组名一样,是一个二级指针常量。

//利用字符指针数组将五门课程名按字典顺序排序输出
#define _CRT_SECURE_NO_WARNINGS
#include#includeint main()
{
	char* arr[5] = { "C/C++","Python","MATLAB","Authorware","Java" };
	int i = 0, j = 0;
	printf("原始顺序为:\n");
	for (i = 0; i< 5; i++)
	{
		puts(arr[i]);
	}
	char* tmp = 0;
	for (i = 0; i< 4; i++)
	{
		for (j = 0; j< 4 - i; j++)
		{
			if (strcmp(arr[j], arr[j + 1]) >0)
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	printf("按字典顺序排序后为:\n");
	for (i = 0; i< 5; i++)
	{
		puts(arr[i]);
	}
	return 0;
}


指针初阶暂时告一段落了,内容还是很多的,一定要吃透啊(虽然对我来说有点小难度,唉……),递归和指针是初阶C语言的半壁江山啊,加油加油,浅浅期待一下指针进阶叭~~~

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文名称:【C语言】指针Pointer初阶(2)-创新互联
标题来源:http://cdiso.cn/article/deopgh.html

其他资讯