指针是c语言中一个很重要的功能,之前稍微的介绍了一下,学会了指针就打开了c语言的大门
今天主要学习了以下内容
目录
1.什么是指针数组
指针数组,顾名思义就是一个含着数组的指针,主语是数组,所以他是一个数组。
由于[]的优先级高于*所以在申请指针的时候先使用的是[]因此就不用加括号了
#include<stdio.h>
void test(int arr[])
{
int sz =sizeof(arr)/sizeof(arr[0]);
printf("%d\n",sz);
}
int main()
{
int arr[10]={0};
test(arr);
return 0;
}
像这段代码就很体现了数组的传参。
指针的大小是固定的4/8个字节(32位平台/64位平台)
指针的类型决定了一个指针的步长是多少,像int类型他就有四个字节,每一步步长是四个字节
下面来介绍一下指针数组
#include<stdio.h>
int main()
{
char arr[]="a,b,c,d,e,f";
char* pa=arr;
printf("%s\n",arr);
printf("%s\n",pa);
return 0;
}
代码编译的结果显示第一种数组的形式和第二种指针的形式最后得到的结果是一样的这说明了两种形式取得的地址是相同的
int main()
{
char* p='abcdef';
printf("%s\n",p);
return 0;
}
这样也是可以输出同样的结果
百度面试题
int main()
{
char arr[]='abcdef';
char arr2[]='abcdef';
char* p1='abcdef';
char* p2='abcdef';
if(arr1==arr2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
这段代码打印的是haha
int main()
{
char arr[]='abcdef';
char arr2[]='abcdef';
char* p1='abcdef';
char* p2='abcdef';
if(p1==p2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
这段代码打印的是hehe
p1p2两个是一样的,p1和p2都指向abcdef
指针数组
#include<stdio.h>
int main ()
{
int a=20;
int b=30;
int c=40;
int d =50;
int* arr[4]={&a,&b,&c,&d};
int i=0;
for (i=0;i<4;i++)
{
printf("%d",*(arr[i]));
}
return 0;
}
这是这段代码的结果
int main ()
{
int arr1[]={1,2,3,4,5};
int arr2[]={2,3,4,5,6};
int arr3[]={3,4,5,6,7};
int* parr[]={arr1,arr2,arr3};
int i =0;
for (i=0;i<3;i++)
{
int j=0;
{
for(j=0;j<5;j++)
{
printf("%d ",*(parr[i]+j));
}
printf("\n");
}
return 0;
}
这是代码执行的结果
2.什么是数组指针
简单来说数组指针本质上是个指针,跟指针数组是有区别的
我把总结都放到代码里了
//#include<stdio.h>
//#include<stdlib.h>
数组指针的用法
参数是指针的用法
//void print(int(*pa)[5], int x, int y)
//{
// int i = 0;
// for (i = 0; i < x; i++)
// {
// int j = 0;
// for (j = 0; j < y; j++)
// {
// printf("%d", (pa[i][j]));
// printf("%d", *(pa[i] + j));
// printf("%d", *(*(pa + i)+j));
// printf("%d ",(*(pa+i))[j]);
// }
// printf("\n");
// }
//
//}
//int main()
//{
// int arr[3][5] = { { 1, 2, 3, 4, 5 }, { 2, 3, 4, 5, 6 }, {3,4,5,6,7} };
// print (arr, 3, 5);
//int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//int *p = &arr;
//int i = 0;
//for (i = 0; i < 10; i++)
//{
/*printf("%d\n",p[i] );
printf("%d\n",*(p+i));
printf("%d\n",arr[i]);
printf("%d\n", *(arr+1));*/
/*}*/
// system("pause");
// return 0;
//}
//void print1(int arr[3][5] ,int x, int y)
//{
// int i = 0;
// for (i = 0; i <x; i++)
// {
// int j = 0;
// for (j = 0; j < y; j++)
// {
// printf("%d ",arr[i][j]);
// }
// printf("\n");
// }
//}
//int main()
//{
// /*int arr[10] = { 1, 2, 3, 4, 5 ,6,7,8,9,10};*/
// int arr[3][5] = { { 1, 2, 3, 4, 5 }, { 2,3,4,5,6 }, { 3,4,5,6,7} };
// print1(arr , 3,5);//arr-数组名-数组名就是首元素地址
/*int * p=&arr;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d",*(p+i) );
}*/
/*int(*pa)[10] = &arr;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", *(*pa+i));
}*/
/*for (i = 0; i < 10; i++)
{
printf("%d", (*pa)[i]);
}*/
/*system("pause");
return 0;
}*/
//int main()
//{
// //int *p = NULL;
// //char *pc = NULL;
// arr-首元素地址
// &arr[0]-首元素的地址
// &arr-数组的地址
// //int arr[10] ={1,2,3,4,5,6,7,8,9,10};
// //int (*pa)[10] = &arr;
// //char *arr[5] ;
// //char*(*pa)[5] = &arr;
// int arr[20] = { 0 };
// int (*pa)[20]=&arr;
// system("pause");
// return 0;
//}
总结,今天仔细的学了指针