指针03

指针和数组

之前有篇文章已经写过数组了 这里我直接画图代替一些数组基础话 忘记的可以翻着看看.

image.png

如果我们要访问一个数组的首元素 会有A[0]这种形式的访问 如果用指针如何访问数组元素呢
int\p = &A[0] 然后我们就可以用指针来操作数组元素了 比如&A[2] = A+2 如果要解引用(A+2)即可 可以把A存放到指针 用指针代替A进行解引用和运算
int *p = &A[0]; 也可以写作 int *p = A; 解引用的话 *(P+i)

#include<stdio.h>
int main()
{
	int arry[5] = { 2,4,6,8,10 };
	int* parry = NULL;
	parry = arry;
	for (size_t i = 0; i < 5; i++)
	{
		printf("address of a[%d]\n", parry+i);
		printf("address of a[%d] = %d\n", i,*(parry + i));
	}
};

image.png

数组作为参数传递

#include<stdio.h>
int Sumarry(int A[])
{
	int sum = 0;
	int size = sizeof(A) / sizeof(A[0]);
	for (size_t i = 0; i < size; i++)
	{
		sum += A[i];
	}
	return sum;
}
int main()
{
	int arry[] = { 1,2,3,4,5 };
	int result = Sumarry(arry);
	printf("the result was = %d\n", result);


}

大家觉得这个程序的运行结果是多少? 运行结果是1 为什么?

image.png

也就是说并不像我们想的那样 会将一整个数组全部传过来 仅仅会传递数组元素首地址,所以我们要想在被调函数中使用数组(知道他的大小)就必须传递一个数组的大小的参数

#include<stdio.h>
int Sumarry(int A[],int s)
{
	int sum = 0;
	//int size = sizeof(A) / sizeof(A[0]);
	for (size_t i = 0; i < s; i++)
	{
		sum += A[i];
	}
	return sum;
}
int main()
{
	int arry[] = { 1,2,3,4,5 };
	int size = sizeof(arry) / sizeof(arry[0]);
	int result = Sumarry(arry,size);
	printf("the result was = %d\n", result);


}

这下结果就符合我们的期望值了。 还可以通过形参改变实参的值的内容

指针和字符串

之前已经写过很多关于字符串的文章了 感兴趣的可以自己去看一下
这里仅对指针操作字符串进行代码编写

#include<stdio.h>
void printfchar(char* c)
{
	int i = 0;
	while (*(c + i) !='\0')
	{
		printf("%c", *(c + i));
		i++;
	}
	printf("\n");

}
int main()
{
	char str[] = "hello";
	printfchar(str);


}

也可以去掉i 利用指针进行自增 C++

在内存中分析这个程序

image.png

字符数组的大小 = 字符数组元素数量
字符数组存放字符串大小 =字符数组元素数量+1 乱总结的 迷糊的别看

char*和char[]辨析

char str[] = “hello”; 编译器会在栈区给这个数组分配一段空间存放 因此我们可以通过指针修改字符串的内容
char*str = “hello”;之前我也说过这种初始化 形式上与字符串数组没有区别 但字符串常量存放在常量区 就是之前画的那个static区 里面的数据是无法修改的 同时他也会一直存在 直到程序运行结束。
写一段程序加深一下记忆

#include<stdio.h>
char* strA()
{
	char str[] = "hello";
	return str;
}
int main()
{
	char* address = strA();
	printf("%s", address);
}

image.png

str创建在栈区后 当被调函数执行完成之后 编译器会清空分配给字符串数组的空间 因此当主调函数去接收返回的首地址时,会发生乱码 因为这段内存已经被清空了 如果改成char*str = “hello”; 因为是保存在常量区 所以不会被清空。

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/82/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 2024年11月14日 上午11:12
下一篇 2024年11月14日 上午11:21

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注