#include
int main(){
int b[2]={1,2};
printf("%p\n",b);
printf("%p\n",&b[0]);
return 0;
}
两者打印出来内存地址是一样的。
000000000061FE18
000000000061FE18
传参的时候,传入方法的是首个元素的地址
#include
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
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)