1、数组名字就是首元素的地址,首元素地址就是数组地址,数组名都可以看做是常量指针,数组变量之间不能相互赋值 int b[] ==> int * const b, b不可以在指向别的数组,数组名字就是常量,不可以放在赋值符号的左边.
2、数组不是指针,指针不是数组,他们只是在某些方面相同
3、int arr[5]={1,2,3,4,5} arr的类型是==>int[5] 计算数组元素个数 sizeof(arr)/sizeof(arr[0]);
4、arr 首元素地址 arr==&arr[0] int *p p =arr ==>arr[0] , 假如地址为0xaabb00;
arr+1 是指第二个元素 0xaabb04 ==>解引用 *(arr+1)==> arr[1]==2
int *p = arr +2 ==> int * p = arr[2]; ==> *p = 3;
&arr+1 是指整个地址加一 则 0xaabb14 ==>20 是指 arr[6] 这是个比较特殊的地址
a[n] == > *(a+n)==> *(n+a)==> n[a] 例子:arr[0]<==> 0[arr]
&arr[0]+1 ==> arr[1]; *(&arr[0]+4)=10; ==> arr[4]=10;
Int ( *p) [5] =arr;=> X(错的) Int ( *p)[5] =&arr 应该要这样初始化,因为arr地址类型是int *
因为p是数组指针,只能指向数组
int* p = arr; int* q = &arr[2]; q-p ==2
5、当数组作为函数参数的时候,编译器会把函数的数组参数退化为指针;
例: func(arr[5]) ==> func(int * arr)
6、int arr[3]=”abc”;字符串字面量 本质是一个数组,是一个无名数组 “abc”[0] ==> a , “ abc”本身是一个地址, *(“abc“+1)==> b; char a =*(””) ; a==>0 因为”” ==> “\0”
当”abc”+1的时候 就是指向下一个数组元素的地址即 ==>”abc”[1]==>b
const char * arr[5] = {“nihao”}; ==> 这个” nihao “ 是常量所以默认的类型是 => const char *
char( *p) arr[5] = {“nihao”}; ==> 这个” nihao “ 是常量所以默认的类型是 => const char *
7、字符串是以第一个出现的\0作为结束的,编译器总是会在字符串字面量的末尾添加”\0” 字符串字面量是存储在只读存储区,字符串一个字符是占用一个字节
8、字符串之间的比较一定要用strcmp完成,不可以直接 == 直接比较
9、数组指针 ==> int (*p)[10] ==>p是一个指针,指向一个有10个元素的数组(是指针)
10、指针数组 ==> int *p[10] => p 是数组,每个成员都是整形指针,(是数组)
11、可以把p当成数组来访问 mun是一个只有一个元素的数组所以下标是0
int mun=10;
int *p = &mun;
printf("mun=%d",mun);
printf("p[0]=%d",p[0]); 指针才可以这样使用
12、char* sp = "We are happy." 无法修改字符串内容,因为这个字符串存放在内存的常量区,定义指针的方法,是让指针指向了常量存储器中的字符串,所以无法修改
char str[] = "We are happy."可以修改字符串内容,因为这个字符串是存放在栈中的,定义数组的方法,是程序将字符串的内容拷贝到的栈中的数组上。
13、char arr [][5]={“a”,”b ”, ”c”}; sizeof(arr) = 15 因为每个字符串(包括结束符\0)都被存储在一个长度为5的字符数组中。因此,每个元素的大小为5字节。数组arr有3个这样的元素,所以整个数组的大小为 3 * 5 = 15字节。因此,sizeof(arr)的结果为15
14、当数组指针指向同一个字符串时,他们所指向的字符串是同一个,地址也是一样.
char * arr = "abcd";
char * arr1 = "abcd"; arr和arr1指向的地址是一样的
15、当一个字符串数组等于相同的字符串时,他们的地址是不一样的
char arr[10] = "abcd";
char arr1[10] = "abcd"; arr和arr1的地址是不一样,有各自的地址