例如,在以下代码中,定义了字符变量c和整数变量a,并分别分配了初始值'B'和50.
#include <stdio.h>
int main(void)
{
char c='A';
int a=100;
printf("a=%d\n",a);//输出变量a的值
printf("&a=%x\n",&a);//输出变量a的地址
printf("c=%c\n",c);
printf("&c=%x\n",&c);
return 0;
}
程序某次的运行结果为:
a=50
&a=12ff40
c=B
&c=12ff44
int a[20];
int *p;
p=a;
指针p加1表示跳过数组元素空间并指向下一个数组元素.
示例:
int *p,a[10];
p=a; //相当于 p=&a[0];
//p+1,相当于访问a[1];
注意: 数组名称a等于数组的第一个元素a [0]的地址,即a等于&a [0].
上面的语句定义了一个整数指针变量p和一个整数数组a,并使p最初指向数组的第一个元素a [0].
当指针变量和数组元素连接时,可以通过以下三种方式访问??数组元素.
直接访问: 数组名称的形式[下标];如a [3]. 间接访问: (数组名称+ i); 0 <>
3)间接访问: (指针变量);通过复制和删除指针P的增量和减量,可以访问不同的数组元素.
for (p=a;p<a+N;p++) //用p的移动范围控制循环次数
printf ("%d\t",*p);
确定指针移动的开始和结束地址,即循环控制表达式的大小是使用指针访问数组元素的关键.
示例1使用指针变量在数组元素上实现输入和输出操作.
#include <stdio.h>
#define N 10
int main (void)
{
int *p,a[N],i;
p=a; //p初始指向a[0]
for(i=0;i<N;i++) //用整型变量i控制循环次数
scanf ("%d",p++); //指针P表示地址,不能写成&P
for(p=a;p<a+N;p++) //用p的移动范围控制循环次数
printf("%d ", *p);
return 0;
}
如果存在二维数组:
int a[3][4] = {{1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23}};
int *p=a;
计算机上的存储空间:
A [0]表示元素a [0] [0]的地址,a [1]表示元素a [1] [0]的地址,即a [1]&a [1] [0]; a [2]表示元素a [2] [0]的地址,即a [2]&a [2] [0].
同时,我们将p指向数组a,然后p [0]表示a [0] []行; p [1]表示p [1] []行...
因此,如果要表示二维数组中的特定元素,则需要专门表示一列
现有:
p[i]+j;//表示i行j列的具体元素;
地址也是指针,并且可以通过间接访问字符*访问指针所指向的空间. 二维数组元素a [i] [j]的几种等效形式可以按以下方式访问.
*(p[i] + j) <--> *(*(p + i) + j) <-->*&p[i][j]<-->p[i][j]
#include<stdio.h>
int main()
{
char *s1="abcde";
char s2[]={"abcde"};
printf("%s,%c%s,%c\n",s1,*s1,s1+1,s1[1]);
printf("%s,%c,%s,%c\n",s2,*s2,s2+1,s2[1]);
return 0;
}
运行结果为:
abcde,a,bcde,b
abcde,a,bcde,b
请注意输出字符和输出字符串之间的区别.
使用指针(例如s1,s1 + 1,s2等)表示字符串时,字符串从指针所指向的字符开始,直到字符串符号“ \ 0”的结尾;当使用s1时,s1 [1],(s1 + 1)calloc 数组,s2 [0]等表示字符,即指针所指的字符或位于下标中的字符元素. 可以看出,字符数组和字符指针的用法相似. 但是两者是不同的:
字符串指针变量本身是一个用于存储字符串的第一个地址的变量. 字符串本身存储在从第一个地址开始并以\ 0结尾的连续存储空间中.
char * ps =“ C语言”;
顺序为:
1. 将内存分配给字符指针;
2. 将内存分配给字符串;
3. 将字符串的第一个地址分配给字符指针;
这里有两点需要清楚考虑:
1. * a仅指向一个字符
#include <stdio.h>
#include <stdlib.h>
int main(void){
char *a= "bcd" ;
printf("输出字符:%c ", *a); /*输出字符,使用"%c"*/
printf("输出字符:%c ", *(a+1) ); /*输出字符,使用"%c"*/
printf("输出字符串:%s ", a); /* 输出字符串,使用"%s";而且a之前不能有"*" */
}
运行结果:
b c bcd
2. 如果字符串常量出现在表达式中,则表示的值是字符串常量的第一个字符的地址. 因此,“ hello”仅代表其地址. 原始的声明方法等效于以下声明方法:
char *a;
a="hello";/"hello"仅代表第一个字符的地址
通过字符指针修改变量字符串
通过字符指针变量,可以访问指向的字符数组中保存的字符串. 您不仅可以读取保存在数组中的字符串,还可以修改字符串的内容. 从数组的本质上可以理解原因: 数组是同一类型的变量的集合,因此存储在其中的字符串可以理解为由几个字符变量组成. 每个字符变量当然都可以更改.
示例:
#include<stdio.h>
#include<string.h>
int main (void)
{
char str[30]="Learn and live."
*p=str;
*(p+6)='A';
*(p+10)='L';
puts(str);
return 0;
}
在此程序中calloc 数组,字符指针p指向数组str中的字符串. 由于字符串由一系列字符变量组成,因此可以通过指针变量p来更改字符串中的字符. 因此,程序输出: 学习和生活.
p =(int)malloc(nsizeof(int))
在特定用途中,您需要将malloc()的返回值转换为特定的指针类型,并将其分配给指针.
请勿超出范围使用,大小由分配后确定.
分配多个连续的空间并将其初始化为0. 应用程序成功后,将返回指向分配的内存空间的起始地址的指针;否则,将返回0. 如果失败,则返回NULL(0).
动态内存释放功能free()
释放应用的动态内存空间.
定义指针frondPtr,behindPtr用于前进和后退以同时修改数组元素
将温度定义为介质修改参数
将frondPtr地址初始化为x;
初始化为落后的Ptr地址是x +(n-1);
对于指针frondPtr地址小于backPtr
frondPtr ++,背后的Ptr-
交换头和尾元素
结束
将op定义为搜索字符
将str [N]定义为搜索字符串
输入搜索字符
getchar()吸收换行符
获取输入字符串
定义字符串指针p并将其初始化为0;
调用FindChar函数查找目标字符并将返回地址分配给p,并判断p是否为0;
找到输出索引索引p与str的首地址之间的差异
未找到输出未找到
函数char * FindChar(char * p,char op)
while (*p 不为0并且不为换行符'\n')
查找字符op
p++;
找到return p;
找不到return NULL;
定义字符数组temp [11]辅助交换字符串
输入N,K
定义字符串数组s [101] [11]以输入和存储字符串;
对于循环输入字符串s [i]
字符串排序
对于j = 0到N-i; j ++进行我扫描
比较相邻字符串的大小,将大字符串向后移动
判断是否进行第K轮
如果您进行第K轮,请按顺序输出每个字符串
否则,进行下一轮扫描
本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-283647-1.html
……