C语言 数组介绍 及 注意问题

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的地址是不一样,有各自的地址

以上是个人笔记,如有错请指正,谢谢

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值