
数组名字是数组的首元素地址,它是一个常量不能修改。a[2] 相当于地址(a)+下标的偏移(2)
int a[] = { 1,2,3,4,5,6,7,8,9 };
printf("a=%pn", a);
printf("&a[0]=%pn", &a[0]);
//a=000000B3484FF968
&a[0]=000000B3484FF968
2、指针 *** 作数组元素
#includeint main(void) { int* p; int arr[] = { 1,2,3,4,5,6,7,8,9 }; p = arr; printf("%dn", *p); //打印数组首元素(1) for (int i = 0; i < 9; i++) { printf("%dn", arr[i]); printf("%dn", p[i]); //两者打印的是一个东西 } return 1; }
其中还等同于:
for (int i = 0; i < 9; i++)
{
printf("%dn", arr[i]); //还能改成:
printf("%dn",*(arr+i)); //*()即为取值,地址加偏移量再取值
printf("%dn",*(p+i));
}
若我想得到arr[1]也就是2,则应该是*(arr+1),而不是*(arr+4),尽管指针大小为4 个字节,但 指针类型变量+1 == 内存地址+sizeof(int)
arr + 1 == &arr +4
int b; int *p; p=&b;
p+1 == &b+sizeof(int)
for (int i = 0; i < 9; i++)
{
printf("%d/n", *p++);//也是一样的
}
但这里的p++就和arr不相等了,因为arr为常量是不会变的。
3、总结int main(void)
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int* p = arr; //指向数组的指针
for (int i = 0; i < 9; i++)
{
//数组的元素可以表示为:p[i]||*(p+i)
//p是变量 arr是常量
//p是一个指针4个字节大小 arr是一个数组40个字节大小
}
return 1;
}
4、指针数组和数组指针
指针数组和数组指针的区别就是符号的优先级:() > [] > *
指针数组:指针的数组 char* q[4]
是一个长度为4的数组里,放了4个char*类型的指针,这些指针存放着对应常量的首地址,大小为16个字节。eg:char* q[]={ "lys" , "is" , "so" , "handsome" }
数组指针:数组的指针 (char*)q[4]
这是一个指针,指向长度为4的一维数组,即指向一个char[4],存放的是一个数组的地址,大小为4个字节。
二、 指针运算1)指针加减偏移量:指针的加减运算和指针的类型有关
#includeint main(void) { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int* p; p = arr; p++; //指针类型+1==地址加sizeof() printf("%pn", p); printf("%p", arr); return 0; } //0000001BB534F51C //0000001BB534F518
2)指针减指针:得偏移量
#includeint main(void) { int step; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int* p; p = &arr[3]; step = p - arr; printf("%d", step); return 0; } //3
注意:指针之间不能作+、*、/、%等等,因为得到的是野指针无意义。
补:!!数组arr[-2]会越界,指针不会,p[-2]相当于*(p-2)。
#includeint main(void) { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int* p; p = &arr[3]; printf("%d", p[-2]); return 0; } //2
3)条件判断:
#includeint main(void) { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int* p; p = &arr[3]; if (p > arr) { printf("lys handsome boyn"); //比较二者的地址谁大 } return 0; } //lys handsome boy
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)