【C语言】指针Pointer初阶(2)-创新互联
目录
创新互联专业为企业提供和龙网站建设、和龙做网站、和龙网站设计、和龙网站制作等企业网站建设、网页设计与制作、和龙企业网站模板建站服务,10多年和龙做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。1.指针与数组
1.1一维数组:
//利用指针访问一维数组
1.2二维数组:
//用指针模拟一个3行4列的数组
// 利用二维数组的行地址和列地址访问二维数组
1.3数组指针
//利用数组指针访问二维数组
2.指针和字符串
//利用字符指针复制字符串
//利用字符指针反转字符串
3.指针数组
//利用字符指针数组将五门课程名按字典顺序排序输出
1.指针与数组
1.1一维数组:区别:指针和数组是不同的对象。指针是一种变量,用来存放地址,大小固定,为4个或8个;数组是一组相同类型元素的结合,是可以放多个元素的,大小是取决于元素个数和元素类型的;
联系:数组的数组名 arr 是数组起始元素的地址(注意不要和数组的首地址 &arr 混淆),地址是可以放在指针变量中的,可以通过指针访问数组。
这里先拓展一下指针与一维数组的关系:
//利用指针访问一维数组已知 int arr [ 10 ] ; int * p = arr ;
则 arr [ i ] = p [ i ] = * ( p + i ) = * ( arr + i ) ;
这些完全等价,但是技多不压身嘛,多会几种总是好的。
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
int* p = arr;//起始p指向arr中第一个元素,即首地址
for (i = 0; i< 10; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
来看看一维指针数组是啥样的(这里涉及到了指针数组的概念,在老下面会讲到)~
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = 50;
int* arr[5] = { &a,&b,&c,&d,&e };
int i = 0;
for (i = 0; i< 5; i++)
{
printf("%d ", *(arr[i]));
}
return 0;
}
1.2二维数组:二维数组名是二级指针常量(行指针)。
设有 arr [3][5] = {"1234","5678","ABCD"}; 则:
arr [ i ] + 0 | arr [ i ] + 1 | arr [ i ] + 2 | arr [ i ] + 3 | arr [ i ] + 4 | |
arr + 0 | arr [0][0] | arr [0][1] | arr [0][2] | arr [0][3] | arr [0][4] |
arr + 1 | arr [1][0] | arr [1][1] | arr [1][2] | arr [1][3] | arr [1][4] |
arr + 2 | arr [2][0] | arr [2][1] | arr [2][2] | arr [2][3] | arr [2][4] |
//用指针模拟一个3行4列的数组行:地址:arr + i = &arr [i]
元素:arr [i] = *(arr + i)
列:地址:arr [i] + j = *(arr + i) + j
元素:arr [i][j] = *(*(arr + i) + j) = *(arr [i] + j) = (*(arr + i)) [j]
int main()
{
int a[] = { 1,2,3,4 };
int b[] = { 2,3,4,5 };
int c[] = { 3,4,5,6 };
int* arr[3] = { a,b,c };
int i = 0;
for (i = 0; i< 3; i++)
{
int j = 0;
for (j = 0; j< 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
// 利用二维数组的行地址和列地址访问二维数组#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
int arr[3][3];
int i = 0, j = 0;
printf("请输入数组:\n");
for (i = 0; i< 3; i++)
{
for (j = 0; j< 3; j++)
{
scanf("%d", *(arr + i) + j);//这里是地址不是元素!!!
}
}
printf("打印的数组为:\n");
for (i = 0; i< 3; i++)
{
for (j = 0; j< 3; j++)
{
printf("%d ", *(*(arr + i) + j));//这里是元素不是地址!!!
}
printf("\n");
}
return 0;
}
1.3数组指针C语言允许定义一个指向一维数组的指针变量——行指针变量,又称数组指针。
格式:type(*数组指针变量名)[一维数组长度]
例如:int(*ptr)[ 3 ] 定义了一个指向3个连续存放的整型数的内存首地址的数组指针。
//利用数组指针访问二维数组二维数组中 arr + 1 和 arr [1] 的区别:
1>arr +1 是一个行指针(二级指针),指向内存中连续5个数据 arr [1][0],arr [1][1],arr [1][2],arr [1][3],arr [1][4];
2>arr [1] 是一个列指针(一级指针),arr [1] = *(arr + 1)= &arr [1][0]。
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int i = 0, j = 0;
int(*p)[3] = arr;//指向arr数组的第一行的3个元素, 此时p相当于 &(arr+0)——行指针(二级)
for (i = 0; i< 3; i++, p++) //注意不是&arr[0]=arr[0][0]——列指针(一级)
{
for (j = 0; j< 3; j++)
{
printf("%d", (*p)[j]);//p相当于&(arr+i),*p相当于 arr+i 即 arr[i]
}
printf("\n");//换行后 p++,指向第二行的3个元素
} //……
return 0;
}
2.指针和字符串一级字符型指针定义方法:char* 一级字符指针变量名;
一开始指向的是字符串在内存中的起始地址,后续使用时还可能指向其他地方。
例如:char* str1 = "C program";
char string[] = "China";
char* str2 = string;
//利用字符指针复制字符串字符指针变量 str 与字符数组 string 的区别:
1>存储内容不同:str 是地址变量,string 是地址常量,都指向 &string[0],但str可变;
2>存储空间长度不同:字符数组长度确定,尾部空间可能闲置,而字符指针变量占用字节数是地址所需长度,与字符串长度无关;
3>赋值方式不同:字符数组定义时可直接初始化,也可利用strcpy赋值,但不能直接赋值,而字符指针变量既可以定义时初始化,也可以稍后直接赋值;
4>接受输入不同:字符数组可以直接接受输入,字符指针变量接受输入的字符串之前要事先指向一段内存存储空间,否则会变成野指针;
5>运算不同:字符数组名是地址常量,不能改变指向,字符指针变量可以参加指针运算,改变指向。
int main()
{
char arr1[20];
char arr2[20];
printf("请输入一个字符串:");
gets(arr1);
char* p1 = arr1;
char* p2 = arr2;
while (*p1)
{
*(p2) = *(p1);
p2++;
p1++;
}
*p2 = '\0';//最后放个字符串结束符,否则会出现乱码
printf("复制后的字符串为:");
puts(arr2);
return 0;
}
//利用字符指针反转字符串#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
char arr[20];
printf("请输入一串字符串:");
gets(arr);
char* begin = arr;
char* end = arr;
while (*end)//知道找到最后一个元素的地址
{
end++;
}
end--;
int tmp = 0;
while (begin< end)//指针比较
{
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
printf("翻转后的字符串为:");
puts(arr);
return 0;
}
3.指针数组//利用字符指针数组将五门课程名按字典顺序排序输出结构:char* 指针数组名 [ 数组长度 ] ;
指针数组与二维数组的区别:
指针数组中的每一个元素所指向的一维数组长度可以不同,一维数组之间也不需要在内存中连续存放;指针数组中的每一个元素均为指针变量,地址可变;数组指针是一个二级指针变量;指针数组名与二维数组名一样,是一个二级指针常量。
#define _CRT_SECURE_NO_WARNINGS
#include#includeint main()
{
char* arr[5] = { "C/C++","Python","MATLAB","Authorware","Java" };
int i = 0, j = 0;
printf("原始顺序为:\n");
for (i = 0; i< 5; i++)
{
puts(arr[i]);
}
char* tmp = 0;
for (i = 0; i< 4; i++)
{
for (j = 0; j< 4 - i; j++)
{
if (strcmp(arr[j], arr[j + 1]) >0)
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
printf("按字典顺序排序后为:\n");
for (i = 0; i< 5; i++)
{
puts(arr[i]);
}
return 0;
}
指针初阶暂时告一段落了,内容还是很多的,一定要吃透啊(虽然对我来说有点小难度,唉……),递归和指针是初阶C语言的半壁江山啊,加油加油,浅浅期待一下指针进阶叭~~~
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文名称:【C语言】指针Pointer初阶(2)-创新互联
标题来源:http://cdiso.cn/article/deopgh.html