第四章 指针和数组
声明和定义的最主要区别:声明并未非配内存, 定义一定分配了内存。
1、当我们在文件1中,定义:
int mango[100];
在文件2中:声明:
extern int *mango;
这是不对的,当你声明为extern int *mango时,编译器理所当然认为mango是一个指针,在文件2中,我用sizeof(mango),结果为4.
定义指针时,编译器并不为指针所指向的对象分配内存空间,它只分配指针本身的空间。除非在定义的同时赋给指针一个字符串常量进行初始化。例:
char *p = "abcdefg";
注意:只有对字符串常量才是如此。不能指望为浮点数之类的常量分配空间,如:
float *pip = 3.14; /*错误, 无法通过编译*/
在ANSI C中,初始化指针时所创建的字符串常量被定义为只读的。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。
数组也可以用字符串常量来进行初始化, 如:
char a[] = "abcdefg;
与指针不同的是, 由字符串常量初始化的数组是可以修改的。
对于数组char a[10];
&a[0]和&a有何异同呢?
很明显,&a[0]表示的是数组首元素的地址,即相当于a, 而&a则表示的是整个数组的首地址, 举个例子
char a[10];
若数组a首元素地址为0xbfb1b022, 则
&a = 0x0xbfb1b022
&a + 1 = 0x0xbfb1b02c
&a[0] = 0x0xbfb1b022
&a[1] = 0x0xbfb1b023
今天先看到这里,过几天再论一下数组和指针!
声明和定义的最主要区别:声明并未非配内存, 定义一定分配了内存。
1、当我们在文件1中,定义:
int mango[100];
在文件2中:声明:
extern int *mango;
这是不对的,当你声明为extern int *mango时,编译器理所当然认为mango是一个指针,在文件2中,我用sizeof(mango),结果为4.
定义指针时,编译器并不为指针所指向的对象分配内存空间,它只分配指针本身的空间。除非在定义的同时赋给指针一个字符串常量进行初始化。例:
char *p = "abcdefg";
注意:只有对字符串常量才是如此。不能指望为浮点数之类的常量分配空间,如:
float *pip = 3.14; /*错误, 无法通过编译*/
在ANSI C中,初始化指针时所创建的字符串常量被定义为只读的。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。
数组也可以用字符串常量来进行初始化, 如:
char a[] = "abcdefg;
与指针不同的是, 由字符串常量初始化的数组是可以修改的。
对于数组char a[10];
&a[0]和&a有何异同呢?
很明显,&a[0]表示的是数组首元素的地址,即相当于a, 而&a则表示的是整个数组的首地址, 举个例子
char a[10];
若数组a首元素地址为0xbfb1b022, 则
&a = 0x0xbfb1b022
&a + 1 = 0x0xbfb1b02c
&a[0] = 0x0xbfb1b022
&a[1] = 0x0xbfb1b023
今天先看到这里,过几天再论一下数组和指针!