#include<stdio.h>
int main()
{
int arr[2]={1,2};
printf("%p\n",&arr[0]);
printf("%p\n",&arr[1]);
return 0;
}
如此代码块中,数组arr中存储两个常量,获取他们地址可知
在16进制数据储存中,c相当于12,又知在int环境下,可看出在存储中两个数据是紧挨着的
#include<stdio.h>
int main()
{
int arr[2]={1,2};
printf("%p\n",&arr[0]);
printf("%p\n",&arr[1]);
printf("%p\n",&arr[2]);
printf("%p\n",&arr[3]);
return 0;
}
?
?取地址可知在arr数组末尾必存在一个地址0061FF1G,该地址存储的数据应为'\0'
在数据存储中即使未存储变量,电脑中已经开辟了一个存储空间用于存储将来需要存储的数据
#include<stdio.h>
int main()
{
char str1[100],str2[100],*p=str1,n=0;
printf("%p",&str1);
printf("输入第一个字符串:");
scanf("%s",str1);
printf("%p\n",&str1[0]);
printf("%p",&str1[1]);
return 0;
}
在数据中*p存储的是相应的值,可以通过传递地址给它
&a等于a等于a[0];相邻的int数组单元的地址差距永远是4。
在C语言中指针是指向变量的,指针存储着相应的地址,变量修改地址也相应修改,这与赋值符不同,指针所指向的随着变量不断变化着,赋值符中变量的变化是一次性的,无连续性,指针是连续性变化的。
#include<stdio.h>
int main()
{
int a=12;
int *p=&a;
printf("%d\n",*p);
printf("%p\n",a);
a=14;
printf("%d\n",*p);
printf("%p",a);
return 0;
}
避免数组越级
优先级:优先级:()>[]>*
int (*p2)[3]
#include<stdio.h>
int main()
{
// int *arr;
// int a=1;
// arr[0]=a;
// arr[1]=2;
// printf("%d\n",*arr);
// printf("%d\n",arr[0]);
// printf("%d\n",arr[1]);
// printf("%d",*(arr+1));
// int *p[3];//本质上是一个数组,里面储存的是地址,指针数组(类比于整型数组就比较好理解了)
// int a[3]={1,2,3};
// p[0]=&a[0];
// printf("%d",*p[0]);
int (*p2)[3];
int a[3]={1,2,3};
// p2=&a;
// printf("%d",*p2[0]);可运行 运行结果为1,其余均不可运行
return 0;
}
是指一个里面储存着的都是整型
int *p[3];
是指一个数组里面存储着地址
#include<stdio.h>
int main()
{
// int *arr;
// int a=1;
// arr[0]=a;
// arr[1]=2;
// printf("%d\n",*arr);
// printf("%d\n",arr[0]);
// printf("%d\n",arr[1]);
// printf("%d",*(arr+1));
int *p[3];//本质上是一个数组,里面储存的是地址,指针数组(类比于整型数组就比较好理解了)
int a[3]={1,2,3};
p[0]=&a[0];
printf("%d",*p[0]);
return 0;
}
#include<stdio.h>
int main()
{
int a=1;
int *i=&a;//程序先将&a赋值给i,相当于i等于&a
printf("%d",*i);
return 0;
}
cs