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