在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 []是等价的。
数组和指针的讨论先到此结束,如有错误还请各位大佬指正,非常感谢。