C语言指针运作机制

指针是C语言中基础的知识点,虽然清楚它的一般定义和简单用法,比如*p是元素,p是地址,但是在函数调用过程中的机制却不是很清楚,所以今天这个博客专门来研究指针的调用。
首先看一个程序:
#include<stdio.h>

void Connect(char* str1, char* str2, char* p) {
int i = 0;
for (; *str1 != ‘\0’😉 {
*p = *str1;
str1++;
p++;
}
for (; *str2 != ‘\0’😉 {
*p = *str2;
str2++;
p++;
}
*p = ‘\0’;
}

int main() {
char strings[60];
char *p;
char str1[] = { “hallo” };
char str2[] = { “world” };
p = strings;
printf(“第一个字符串是%s\n”, str1);
printf(“第二个字符串是%s\n”, str2);
Connect(str1, str2, p);
printf(“拼接后的字符串为%s\n”, p);
system(“pause”);
return 0;
}
注意到主函数中的指针变量和调用函数中的指针变量是相同的,但是实际上改成不一样的对程序没有影响,两个函数中的指针内存地址不同。
注意到主函数中调用了str1,str2,p三个指针,将其传入Connect函数中,在调用函数中对地址进行递增操作,完成将指针p指向两个字符串的目的, *p = ‘\0’;上一命令是p++,此时p指向的地址是合成字符串的最后一个地址。该调用函数类型为空,完成操作后函数无返回值,但是在主函数中为什么在调用p时,此时p指向了合成字符串的开头,而不是调用函数中的结尾,很让我疑惑。

为了验证指针的变换过程,将调用函数放到主函数中,
int main() {
char strings[60];
char* p;
int i = 0;
char st1[] = { “hallo” };
char st2[] = { “world” };
char *str1;
char *str2;
str1 = st1;
str2 = st2;
p = strings;
printf(“第一个字符串是%s\n”, str1);
printf(“第二个字符串是%s\n”, str2);
//Connect(st1, st2, p1);

for (; *str1 != '\0';) {
	*p = *str1;
	str1++;
	p++;
}
for (; *str2 != '\0';) {
	*p = *str2;
	str2++;
	p++;
}
*p = '\0';
printf("拼接后的字符串为%s\n", p);

return 0;

}
上面的程序也可以这样改,
const char* str1 = “hallo” ;
const char* str2 = { “world” };
//char *str1;
//char *str2;
//str1 = st1;
//str2 = st2;
下面的str1++,str2++,都不会报错,说明可以对const char 类型的指针进行操作,但是不能对其赋值,即str1=*str2,这样会报错,
这样改之后程序指针p将没有输出,说明此时指针p指在末尾。将末尾的程序改成:
*p = ‘\0’;
printf(“拼接后的字符串为%s\n”, p);
p = strings;
printf(“拼接后的字符串为%s\n”, p);
此时会发现第一个无输出,第二个有输出。这是因为 p = strings;这个命令重新将指针p指向首地址。

总结:函数中的p和主函数的p的不是相同的,主函数中调用函数,直接对主函数中的数组进行操作,因此能够实现目的。
查阅资料后发现这个涉及到全局变量、堆载的概念。
1、全局区(静态区):全局变量和静态变量存储的地方,它与其他变量的不同之处就是生命周期的不同,全局区的变量只有在程序结束时系统才会释放该块资源。
2、文字常量区:常量字符串存放的地方。它也是在程序结束时释放。
3、栈区:存放函数的参数值,局部变量值等,进入区域分配内存,超出区域收回内存。
4、堆区:程序员分配程序员释放。
原文链接:https://blog.csdn.net/liuzhanchen1987/article/details/7918841

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值