C语言数组传参以及字符串定义

C语言的数组形参传递

打印数组与数组首个元素的地址是一样的

#include <stdio.h>

int main()
{

   int r[]={1,2,3};
   int *rp=r;
   int **rpp=&rp;
   printf("%p\n",r);
   printf("%p\n",rp);
   printf("%p\n",&r[0]);
   printf("===========\n");
   printf("%p\n",&rp);
   printf("%p\n",rpp);
   printf("%d\n",*(*rpp+1));
}


r、rp、&r[0]三者打印出来内存地址是一样的。rpp为二级指针,指向rp

000000000061FE0C
000000000061FE0C
000000000061FE0C
===========
000000000061FE00
000000000061FE00
2

传参的时候,传入方法的是首个元素的地址

#include <stdio.h>
void test1(int *p){
	printf("%p\n",p);
   printf("sizeof %d\n",sizeof(p));
}
 
 
int main(){
	
	
   int b[4]={1,2,3,4};
   printf("%p\n",b);
   printf("%p\n",&b[0]);
   test1(b);
   test1(&b[0]);
	return 0;	
}

传递的参数是指针,sizeof 计算的是指针的大小,64位系统中指针大小是8字节

000000000061FE10
000000000061FE10
000000000061FE10
sizeof 8
000000000061FE10
sizeof 8

字符串数组

两种定义形式:
1、 char *b = “aA”;
2、 char c[] = “as”;
可认为字符串指针p与b具有相同地位

   char *b = "aA";
   char c[] = "ab";
   char *p;
   p = c;
#include <stdio.h>
int main()
{

   char *b = "aA";
   char c[] = "ab";
   char *p;
   p = c;

   printf("c的内存值%p\n", c);
   printf("c的指针值p为%p\n", p);
   printf("*p为字符串第一个元素%d\n", *p);
   printf("*(p+1)为字符串第二个元素%d\n", *(p + 1));
   printf("sizeof(p)为指针所占内存的大小%d\n", sizeof(p));
   printf("sizeof(c)为该字符串所占内存的大小%d\n", sizeof(c));
   printf("该char数组的长度%d\n", sizeof(c) / sizeof(*p));
   printf("==========采用char *b= \"aA\"; 定义的区别,无法获取整个字符串的长度\n");
   printf("*b为字符串第一个元素%d\n", *b);
   printf("*(b+1)为字符串第二个元素%d\n", *(b + 1));
   printf("*(b+2)为字符串第三个元素(数组边界溢出)%d\n", *(b + 2));
   printf("*(b+3)为字符串第四个元素(数组边界溢出)%d\n", *(b + 3));
   printf("sizeof(b)为指针所占内存的大小%d\n", sizeof(b));

}
c的内存值000000000061FE0D
c的指针值p为000000000061FE0D
*p为字符串第一个元素97
*(p+1)为字符串第二个元素98
sizeof(p)为指针所占内存的大小8
sizeof(c)为该字符串所占内存的大小3
该char数组的长度3
==========采用char *b= "aA"; 定义的区别,无法获取整个字符串的长度
*b为字符串第一个元素97
*(b+1)为字符串第二个元素65
*(b+2)为字符串第三个元素(数组边界溢出)0
*(b+3)为字符串第四个元素(数组边界溢出)99
sizeof(b)为指针所占内存的大小8

字符串strcat缓存区溢出

#include <stdio.h>
#include <string.h>
int main()
{

   char c[5] = "ab";
   char e[5] = "ab";
   char d[20] = "eeeeeeeeeeeeeeeeee";
   printf("c的内存地址%d\n", c);
   printf("e的内存地址%d\n", e);
   printf("d的内存地址%d\n", d);
   strcat(c, d);
   printf("执行strcat(c, d)后c的值%s\n", c);
   printf("执行strcat(c, d)后e的值%s\n", e);
   strcat(e, d);
   printf("执行strcat(e, d)后c的值%s\n", c);
   printf("执行strcat(e, d)后e的值%s\n", e);

}

内存按照d、e、c排列
当执行strcat(c, d)后,在c后方添加d的字符串
当执行strcat(e, d)后,在e后方添加d的字符串,由于e的空间不足,从而影响到c的值。

c的内存地址6422043
e的内存地址6422038
d的内存地址6422016
执行strcat(c, d)后c的值abeeeeeeeeeeeeeeeeee
执行strcat(c, d)后e的值ab
执行strcat(e, d)后c的值eeeeeeeeeeeeeee
执行strcat(e, d)后e的值abeeeeeeeeeeeeeeeeee
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值