指针
1、主调用函数分配的内存(堆、stack、全局区),可以在被调用函数里面使用(指针做函数参数),被调用函数分配的内存(malloc的内存、static、内存可以让主调用函数使用,但是临时区stack属性的内存不可以)
2、指针变量和它所执行的内存空间变量是两个不同的概念。
指针与数组
1、
C语言在表达式中把一个类型为T的数组的左值当作是指向该数组第一个元素的指针。
2、一个数组就是一个地址,一个指针就是一个地址的地址。
3、对数组的引用如a[i]在编译时总是被编译器改写成*(a+i)。
4、把传递给函数的数组参数转换为指针是出于效率的考虑。
指针与数组并不相同
1
、 数组和指针在编译器处理时是不同的,在运行时的表示形式也是不一样的,并可能产生不同的代码。
多维数组
当几个"[]"修饰符连续出现时,就是定义一个多维数组(其他语言称之为“数组的数组”)
C语言里面只有一种别的语言称之为数组的数组的形式,但C语言称它为多维数组。
指针什么时候与数组相同
1、所有作为函数参数的数组名总是可以通过编译器转换为指针
2、数组的声明就是数组,指针的声明就是指针,两者不能混淆
3、在使用数组(在语句或表达式中引用)时,数组总是可以写成指针的形式,两者可以互换
数组声明
1、
外部数组的声明:extern,如extern char a[];不能改写成指针的形式
2、
定义,char a[10];不能改写成指针的形式
3、
函数的参数,如test(char a[]);可以随自己喜欢,选择数组形式或者指针形式 1、在特定的上下文环境中,也就是作为一个函数调用的参数使用2、数组实际是作为指针来传递的
在表达式中使用
1、数组名出现在一个表达式中时(与声明不同),它会被被转换成一个指向该数组第一个元素的指针。
2、数组下标表达式总是可以改写成带偏移量的指针表达式。
3、在表达式中,指针和数组是可以互换的,因为它们在编译器里的最终形式都是指针。
4、在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针。
指针与数组引用的汇编比较
代码:int a[2] = {10, 5}
int *pa = a;
代码:void test(int a[])
{
a[0] = 10;
}