【c语言】学习笔记(五):指针数组和数组指针
-
指针数组 和 数组指针
指针数组:int *p[5]; 分析:’[ ]‘的优先级高于’*’,所以该语句定义的是一个整型数组,但是它存放的并不是整型数据,因为前面还有一个星号。 指针数组是一个数组,每个数组元素存放的是一个指针变量。
数组指针:int (*p)[5]; 分析:该语句从左到右,首先定义了一个指针变量p,后面又紧跟一个数组,也就是说该指针指向的是一个数组。 数组指针是一个指针,它指向的是一个数组。
总的来说,指针数组是一个包含多个指针的数组,数组指针是指向数组的一个指针。
下面就举两个栗子!
#include <stdio.h>
#include <string.h>
int main(){
char *p[5] = {
"images of unsurpassed clearity",
"overseas tour",
"legally binding provisions",
"pin down"
};
int i;
for (i = 0 ; i < 5 ; i++){
printf("%s\n", p[i]);
}
return 0;
}
运行结果:
images of unsurpassed clearity
overseas tour
legally binding provisions
pin down
--------------------------------
Process exited after 0.0765 seconds with return value 0
请按任意键继续. . .
数组指针访问一维数组的例子:
#include <stdio.h>
#include <string.h>
int main(){
int i ;
int a[5] = {1 , 2 , 3 , 4 , 5};
int (*p)[5] = &a;
for (i = 0 ; i < 5 ; i++)
{
printf("%d\n" , *(*p + i));
}
return 0;
}
运行结果:
1
2
3
4
5
--------------------------------
Process exited after 0.1455 seconds with return value 0
请按任意键继续. .
数组指针访问二维数组的例子:
#include <stdio.h>
int main()
{
int a[3][4] = {
{ 1 , 2 , 3 , 4 },
{ 5 , 6 , 7 , 8 },
{ 9 , 10 , 11 , 12}};
int (*p)[4] = a;
int i , j;
for (i = 0 ; i < 3 ; i++)
{
for (j = 0 ; j < 4 ; j++)
{
printf("%-4d" , *(*(p + i) + j));
}
printf("\n");
}
return 0;
}
- 数组的下标访问和指针法访问是等价的,可以用下面代码中的方法访问数组元素。
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int *b;
b = &a[3];
printf("%d\n", b[-1]);
return 0;
}
3
--------------------------------
Process exited after 0.1284 seconds with return value 0
请按任意键继续. . .
-
int array[5] = {1 , 2 , 3 , 4 , 5};
注意:array 和 &array 虽然值相同,但是它们的含义不一样,array 表示第一个元素的位置,而&array表示的是整个数组的位置(数组看成一个整体)
array + 1 :表示指向第二个数组元素的位置; &array + 1 表示指向下一个数组第一个元素的位置,即第6个元素。
-
回到最根本的问题上,到底什么是指针呢?指针其实包含两方面的信息:一是某个数据结构的起始地址,二是该结构的跨度。
例如,int (*p)[5] = &array ; 这个指针的起始地址就是数组第一个元素的地址,跨度是整个数组,所以p + 1表示下一个数组的地址。因此我们不能这样来定义指针p: int (*p)[5] = array;
-
*(array + i) == array[i] *(*(array + i ) + j) == a[i][j] *(*(*(array + i ) + j ) + k ) == a[i][j][k] 举个栗子:
#include <stdio.h>
int main()
{
int a[2][3] = { {1 , 2 , 3} , {4 , 5 ,6}};
int (*p)[3] = a;
printf("*a = %d\n" , *a);
printf("**a = %d\n" , **a);
printf("\n");
printf("*(a + 1) = %d\n" , *(a + 1));
printf("**(a + 1) = %d\n" , **(a + 1));
printf("\n");
printf("*(*(a + 1)+ 1) = %d\n" , *(*(a + 1) + 1));
printf("a[1][1] = %d\n" , a[1][1]);
return 0;
}
*a = 6487552
**a = 1
*(a + 1) = 6487564
**(a + 1) = 4
*(*(a + 1)+ 1) = 5
a[1][1] = 5
--------------------------------
Process exited after 0.06324 seconds with return value 0
请按任意键继续. . .
|