C 语言指针进阶

C 语言指针进阶,第1张

C 语言指针进阶
#define _CRT_SECURE_NO_WARNINGS 1
#include

int main()
{
	char arr1[] = "hello";
	char arr2[] = "hello";
	char * p1 = "hello";
	char * p2 = "hello";

	if (arr1 == arr2)
		printf("arr1和arr2相同n");
	else
		printf("arr1和arr2不相同n");

	if (p1 == p2)
		printf("p1和p2相同n");
	else
		printf("p1和p2不相同n");

	printf("n");
	printf(arr1);
	printf("n");
	printf(arr2);
	printf("n");

	printf("n");
	printf("%p", & arr1);
	printf("n");
	printf("%p", & arr2);
	printf("n");

	printf("n");
	printf("%p", p1);
	printf("n");
	printf("%p", p2);
	printf("n");
	return 0;
}

注意:这里if判断语句比较的是数组的位置不是数组里面的元素是否相等 

如果我们要比较两个 数组 是否相等,我们不可以直接使用等于进行比较,且没有系统方法可以进行直接比较。. 要比较两个 C 语言的数组是否相等,我们只有使用 for 循环 或者 while 循环 去遍历数组,然后进行挨个比较。.

这里对于指针来说,指向的东西相同就没有必要开辟两个空间,而且指针是不能像数组一样修改里面的元素的,可以把这个理解为常数

指针数组

数组 - 数组中存放的是指针(地址)

变量类型 * 数组名[数组长度] ;             //存放整形指针的数组

指针数组的使用 

#define _CRT_SECURE_NO_WARNINGS 1
#include

int main()
{
	int arr1[] = { 12,2,3,4,5 };
	int arr2[] = { 2,12,23,54,15 };
	int arr3[] = { 124,26,30,46,55 };

	int* p[] = { &arr1,&arr2,&arr3 };

	for (int i = 0; i < sizeof(p)/sizeof(p[0]); i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d", *(p[i] + j));
		}
		printf("n");
	}

	return 0;
}

数组指针

是一种指针 - 指向数组的指针

整型指针 - 指向整形的指针

字符指针 - 指向字符的数组

定义方法

类型名(*指针名)【数组长度】 = &数组名字

#define _CRT_SECURE_NO_WARNINGS 1
#include

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int(*p)[10] = &arr;
	//这里的&arr取出的是数组的地址
	//parr 就是一个数组指针 - 其中存放的是数组的地址

	printf("%d", (*p)[0]);
	printf("%d", (*p)[1]);
	printf("%d", (*p)[2]);
	printf("%d", (*p)[5]);
	printf("%d", (*p)[6]);

	return 0;
}

数组名是数组首元素的地址

但是有两个列外

1.sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小,单位是字节

2.&数组名 - 数组名表示整个数组,取出的是整个数组的地址

数组指针的使用

#define _CRT_SECURE_NO_WARNINGS 1
#include

void printf1(int arr[3][5],int x,int y)
{
	int i = 0;
	int j = 0;
	for ( i = 0; i < x; i++)
	{
		for ( j = 0; j < y; j++)
		{
			printf("%d", arr[i][j]);
		}
		printf("n");
	}
}

void printf2(int (*p)[5],int x,int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d", *(*(p+i)+j));
			//这里大体可以理解为p+i解开的是行,+j解开的是列
		}
		printf("n");
	}
}

int main()
{
	int arr[3][5] = { {1,2,3,4,5},{7,8,9,4,5},{3,7,5,6,4} };
	printf("输出二维数组的所有元素n");
	printf1(arr,3,5);
	printf("--------------------------------------------------------n");
	printf2(arr, 3, 5);

	return 0;
}

int arr[5];

定义的一个数组长度为五的整形数组

int *parr1[10];

 定义了一个存放10个整形指针的数组

int (*parr2)[10];

代表的是指向数组长度为10的指针

int (*parr3[10])[5];

parr3是一个存储数组指针的数组

该数组能够存放10个数组指针

每个数组指针能够指向一个数组,数组5个元素,没个元素都是int类型

一级指针传参

#include

void print(int* p,int sz){
    for (int i = 0; i < sz; i++)
    {
        printf("%dn",*(p+i));
    }
    
}

int main(){
    int arr[] = {1,2,3,4,5,6,7};
    int *p = arr;
    int sz = sizeof(arr)/sizeof(arr[0]);

    print(p,sz);

    return 0;

}

一级指针传参,函数接受的指针类型也就是地址类型

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5635260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存