- 指针与数值
通过指针我们可以访问内存中任意地址,那么自然可以访问数组,因为数组在内存中占据了一段连续的空间,那么如何实现的呢?
1 #include<stdio.h> 2 3 int main(){ 4 //定义一个整型数组 5 int array[4] = {7,15,3,9}; 6 //定义一个整型的指针 7 int *p; 8 //将数组的首元素地址赋值给指针p 9 p = &array[0]; 10 //打印出指针所指内存单元的值 11 printf("指针所指内存单元的值为%d ",*p); 12 return 0; 13 }
运行结果:
代码的第9行是将数组的第0号位置的元素地址赋值给指针p,由于C中规定数组名代表数组首地址,也就是首元素的地址,所以第9行代码也可换成
p = array;
那么有些人就会疑问了,我要是想访问数组中其他元素呢?是不是还得定义另一个指针变量,让需要被访问的元素地址赋值给这个新的指针呢?答案是不需要
实际上从上面的p = array;代码中就能看出一些端倪,因为我们用array[2]时能直接访问数组的第2号元素,那么是不是可以用p[2]这种形式间接访问呢?
1 #include<stdio.h> 2 3 int main(){ 4 //定义一个整型数组 5 int array[4] = {7,15,3,9}; 6 //定义一个整型的指针并初始化 7 int *p = array; 8 //利用指针遍历整个数组 9 for (int i = 0; i < 4; i++) { 10 printf("第%d号元素为:%d ",i, p[i]); 11 } 12 13 return 0; 14 }
运行结果为代码的第10行中p[i]等效于array[i],它也可以表达成*(p+ii)或者*(array+i)。下列代码就是演示这个效果
1 #include<stdio.h> 2 3 int main(){ 4 //定义一个整型数组 5 int array[4] = {7,15,3,9}; 6 //定义一个整型的指针并初始化 7 int *p = array; 8 9 printf("%d---%d---%d---%d ", p[2], array[2], *(p+2), *(array+2)); 10 return 0; 11 }
程序代码的第9行中的*(p+2)的含义是将指针p移动8个字节(64为系统中int中用4个字节空间)然后取出接下来4个字节空间中的int数值,
*(array+2)的好意和*(p+2)的含义是一样如果指针变量是float型的那么*(p+2)的含义就是将指针p移动16字节,然后取出接下来8个字节空间的float数值
1 #include<stdio.h> 2 3 int main(){ 4 //定义一个整型数组 5 int array[4] = {7,15,3,9}; 6 //定义一个整型的指针并初始化 7 int *p = &(array+1); 8 9 printf("%d ", *(p+2)); 10 return 0; 11 }
如果看明白了上述文字的叙述,那就不难猜出这个程序的输出结果,对,输出结果就是 9
- 指针与字符串
指针定义字符串
字符串是由多个字符组成的,我们可以用字符数组定义一个字符串有两种形式
1 //第一种定义方式,注意最后的' ' 2 char country[] = {'C','h','i','n','a','