C/C++指针、数组与内存管理(一)

在C/C++中,指针应该是一个难点。在之前也是自己的一个薄弱点,还好在今年转到应用层之后对指针的理解加深了,在此也做个总结。

说到指针,总是和内存管理分不开。内存管理在一个程序中的重要性不用多说。

指针和数组的区别

1.数组名不是指针。

#include <stdio.h>

int main()
{
    char str[10];
    char *pstr;
    printf("length: str = %d, pstr = %d\n", sizeof(str), sizeof(pstr));
    return 0;
}

得出的结果:

length: str = 10, pstr = 8

在某些系统下指针的长度可能是4个字节,都不等于10,所以数组名不是指针。

2.数组名有某些指针的特性

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[12] = "hello world";
    char str2[12];
    strcpy(str2, str1);
    printf("str1 = %s, str2 = %s\n", str1, str2);
    return 0;
}

输出结果:

str1 = hello world, str2 = hello world

strcpy函数的两个形参是char *类型的指针,但我们却给它传了两个数组名。在数组字符串中,数组名是数组第一个元素的地址,相当于该字符串的首地址,类似指针指向字符串的首地址。数组名代表了数组的首地址。

从某本书上抄来的对数组名的三个结论:

(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组

(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;

(3)指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址。

3.数组名可能失去其数据结构内涵

#include <stdio.h>
#include <string.h>

int array_test(char str[]) 
{
    printf("sizeof(str) = %d\n", sizeof(str));
    return 0;
}

int main()
{
    char str[12] = "hello world";
    array_test(str);
    return 0;
}

输出结果:

sizeof(str) = 8

结论:

(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针

(2)在数组名退化为指针后,其也失去了常量的特性,可以自增、自减以及被修改

(3)在函数声明中形参类型char *和char []是等价的。

 

数组和指针的讨论先到此结束,如有错误还请各位大佬指正,非常感谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值