一、指针和数组
1、数组名
数组名字是数组的首元素地址,它是一个常量不能修改。a[2] 相当于地址(a)+下标的偏移(2)
int a[] = { 1,2,3,4,5,6,7,8,9 };
printf("a=%p\n", a);
printf("&a[0]=%p\n", &a[0]);
//a=000000B3484FF968
&a[0]=000000B3484FF968
2、指针操作数组元素
#include <stdio.h>
int main(void)
{
int* p;
int arr[] = { 1,2,3,4,5,6,7,8,9 };
p = arr;
printf("%d\n", *p); //打印数组首元素(1)
for (int i = 0; i < 9; i++)
{
printf("%d\n", arr[i]);
printf("%d\n", p[i]); //两者打印的是一个东西
}
return 1;
}
其中还等同于:
for (int i = 0; i < 9; i++)
{
printf("%d\n", arr[i]); //还能改成:
printf("%d\n",*(arr+i)); //*()即为取值,地址加偏移量再取值
printf("%d\n",*(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)指针加减偏移量:指针的加减运算和指针的类型有关
#include <stdio.h>
int main(void)
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p;
p = arr;
p++; //指针类型+1==地址加sizeof()
printf("%p\n", p);
printf("%p", arr);
return 0;
}
//0000001BB534F51C
//0000001BB534F518
2)指针减指针:得偏移量
#include <stdio.h>
int 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)。
#include <stdio.h>
int 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)条件判断:
#include <stdio.h>
int 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 boy\n"); //比较二者的地址谁大
}
return 0;
}
//lys handsome boy