指针和数组
#include<stdio.h>
int main()
{
int i;
int arr[]={1,2,3,4,5,6,7,8,9,10};
\\数组名是一个常量 不允许赋值
\\数组名是数组首元素地址
int* p;
p=arr;
for(i=0;i<10;i++)
{
\\ printf("%d\n",arr[i]);
\\printf("%d\n",p[i]);
\\printf("%d\n",*(p+i));
\\*(p+i)=*(arr+i)
\\p+i表示地址的偏移量 *(p+i) 表示为地址加偏移量在用*取值
printf("%d\n",*p++);
}
}
输出结果均为:
1
2
3
4
5
6
7
8
9
10
**p[i]= (p+i)= p++
#include<stdio.h>
int main()
{
int i;
int arr[]={1,2,3,4,5,6,7,8,9,10};
int* p;
p=arr;
for(i=0;i<10;i++)
{
printf("%d\n",*p++);
}
printf("%d\n",p); \\打印p地址
printf("%d\n",arr);\\打印arr的地址
int step=p-arr; \\两个指针相减得到的结果是两个指针的偏移量(步长)
\\所有的指针类型相减的结果都是int类型
printf("%d\n",step);
return 0;
}
输出结果:
1
2
3
4
5
6
7
8
9
10
6487560
6487520
10
p经过*p++后p!=arr了,地址发生了偏移
10表示经过*p++后,p和arr相差了10个int类型 一个int类型占4个地址
指针类型变量+1=内存地址+sizeof(int)p+1指向数组的下一元素
#include<stdio.h>
int main()
{
int i;
int arr[]={1,2,3,4,5,6,7,8,9,10};
\\p 此时是指向数组的指针
int* p=arr;
\\p是变量 arr是常量
\\p是一个指针 4个字节大小
\\arr是一个数组 元素个数*4字节大小
printf("指针类型大小:%d\n",sizeof(p));
printf("数组大小:%d\n",sizeof(arr));
return0;
}
输出结果:
指针类型大小:4
数组大小:40