-
C语言指针例题
2019-06-22 20:51:38用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出 #include <stdio.h> void swap(int *pa,int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void main() { ...用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出
#include <stdio.h> void swap(int *pa,int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void main() { int a,b,c,temp; scanf("%d%d%d",&a,&b,&c); if(a>b) swap(&a,&b); if(b>c) swap(&b,&c); if(a>c) swap(&a,&c); printf("%d,%d,%d",a,b,c); }
用指针方法 输入3个字符串 按由小到大顺序输出
#include "stdio.h" #include "string.h" int main(int argc, char* argv[]) { char *t; char *p1=NULL,*p2=NULL,*p3=NULL; char ch1[20]={0},ch2[20]={0},ch3[20]={0}; p1=ch1; p2=ch2; p3=ch3; printf("No1:"); scanf("%s",p1); fflush(stdin); printf("No2:"); scanf("%s",p2); fflush(stdin); printf("No3:"); scanf("%s",p3); fflush(stdin); if(strcmp(p1,p2)>0) {t=p1;p1=p2;p2=t;} if(strcmp(p1,p3)>0) {t=p1;p1=p3;p3=t;} if(strcmp(p2,p3)>0) {t=p2;p2=p3;p3=t;} printf("%s\n%s\n%s\n",p1,p2,p3); return 0; }
编程输入一行文字,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数
#include<stdio.h> void main() { int a=0,b=0,c=0,d=0,e=0,i=0; char *p,s[20]; while((s[i]=getchar())!='\n')i++; p=s; while(*p!=10) { if(*p>='A'&&*p<='Z') a++; else if(*p>='a'&&*p<='z') b++; else if(*p==' ') c++; else if(*p>='0'&&*p<='9') d++; else e++; p++; } printf("大写字母 %d 小写字母 %d\n",a,b); printf("空格 %d 数字 %d 非字符 %d\n",c,d,e); }
写一个函数,将3 3矩阵转置
#include "stdio.h" void Transpose(int (*matrix)[3]) { int temp; int i, j; for(i=1;i<3;i++)/*转置*/ { for(j=0;j<i;j++) { temp = *(*(matrix+j)+i); *(*(matrix+j)+i) = *(*(matrix+i)+j); *(*(matrix+i)+j) = temp; } } } void main() { int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; Transpose(a); for(int i = 0;i<3;i++) { for(int j=0;j<3;j++) { printf("%d ",a[i][j]); } printf("\n"); } } }
用指向一维数组的指针做函数参数
#include<stdio.h> #include<string.h> int main() { void sort(char (*s)[6]);//一维数组的指针做函数参数 int i; char str[10][6]; char (*p)[6];//定义一维数组的指针做函数参数 printf("please input string:/n"); for(i=0;i<10;i++) scanf("%s",&str[i]); p=str;//将str一维数组指针,赋值给p; sort(p); printf("the output sequence :/n"); for(i=0;i<10;i++) printf("%s/n",str[i]); return 0; } void sort(char (*s)[6])//s指向一维数组的指针做函数参数; { int i,j; char temp[6], *t; t=temp; for(i=0;i<9;i++)//i应该小于9;如果小于10,那么就比较了9+1次;按照冒泡法则, for(j=0;j<9-i;j++)//第一次比较需要9次就是i=0到i=8共九次;第二次需要比较8次;依次类推; if(strcmp(s[j],s[j+1])>0) { strcpy(t,s[j]); strcpy(s[j],s[j+1]); strcpy(s[j+1],t); } }
用指针数组在主函数中输入十个等长的字符串。用另一函数对它们排序,然后在主函数中输出10个已排好序的字符串
//用指针数组处理 #include<stdio.h> #include<string.h> int main() { void sort(char *[]); int i; char str[10][6], *p[10]; printf("please input 10 string:/n"); for(i=0;i<10;i++)//首先将10个str的首地址赋值给10个p[i]; p[i]=str[i];//将第i个字符串的首地址赋予指针数组p的第i个元素; for(i=0;i<10;i++) scanf("%s",p[i]);//scanf输入到&p[i] sort(p); printf("the output 10 string:/n"); for(i=0;i<10;i++) printf("%s/n",p[i]);//输出到p[i]; } void sort(char *s[]) { char *temp; int i,j; for(i=0;i<9;i++) for(j=0;j<9-i;j++) if(strcmp(*(s+j),*(s+j+1))>0) { temp=*(s+j);//*(s+j)指向数组指针,我想应该是字符串的首地址;所以可以直接赋值给temp指针; *(s+j)=*(s+j+1); *(s+j+1)=temp; } }
指针 将n个数按输入时顺序的逆序排列,用函数实现
#include <stdio.h> void reverse(int a[],int n) { int *p; for(p=a+n-1;p>=a;p--) printf("%4d",*p); printf("\n"); } main() { int a[20],n; int i; printf("Input the length of array:"); scanf("%d",&n); printf("Input the number of array:"); for(i=0;i<n;i++) scanf("%d",&a[i]); reverse(a,n); }
写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为:
int stremp(char *p1,char *p2)
设p1指向字符串s1,p2指向字符串s2。要求:当s1=s2时,返回值为0。当s1不等于s2时,返回它们二者的第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二字母不同,“O”与“A”之差为79-65=14);如果s1>s2,则输出正值;如果s1<s2,则输出负值。#include <stdio.h> main() { int strcmp(char *p1,char *p2); int m; char str1[20],str2[20],*p1,*p2; printf("Input two strings:\n"); scanf("%s",str1); scanf("%s",str2); p1=&str1[0]; p2=&str2[0]; m=strcmp(p1,p2); printf("result: %d\n",m); } int strcmp(char *p1,char *p2) /*两个字符串比较的函数*/ { int i; i=0; while(*(p1+i)==*(p2+i)) if(*(p1+i++)=='\0') return(0); /*相等时返回结果0*/ return(*(p1+i)-*(p2+i)); /*不等时返回结果为第一个不等字符ASCII码的差值*/ }
运行情况如下:
① Input two strings:
CHINA↙
Chen↙
Result: -32
② Input two strings:
hello! ↙
Hello! ↙
Result: 0
③ Input two stings:
dog↙
cat↙
result: 1编一个程序,打入月份号,输出该月的英文月名。例如,输入“3”,则输出“March”,要求用指针数组处理。
#include <stdio.h> main() { char *month_name[13]={"illegal month","January","February","March","April", "May","June","July","August","September","October","November","December"}; int n; printf("Input month: "); scanf("%d",&n); if((n<=12)&&(n>=1)) printf("It is %s.\n",*(month_name+n)); else printf("It is wrong.\n"); }
运行结果:
① Input month: 2↙
It is February.
② Input month: 8↙
It is August.
③ Input month: 13↙
It is wrong.将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。请用指针实现
#include <stdio.h> #include <string.h> #define MAX_LENGTH 32 int main() { char str[MAX_LENGTH] = {0}; char *pStr = (char*)&str; //1. 将字符串computer赋给一个字符数组 strcpy(str, "computer"); //2. 然后从第一个字母开始间隔地输出该串 while(*pStr != '\0' ) { printf("%c\n", *pStr); pStr++; } return 1; }
从键盘上输入一个字符串,按后按照下面要求输出一个新字符串, 新的字符串是在原来字符串中, 每两个字符之间插入一个空格, 如原来的字符串为“abcd”, 新产生的字符串应为“a b c d”
编写一个程序咯 用C 就是输出的字符 是 每两个字符之间有一个空格#include<stdio.h> void main() { char a[10],b[10],i=0,j=0; printf("输出字符串"); scanf("%s",a);// abcdef for(i=0;a[i]!='\0';i++) { b[j++]=a[i]; b[j++]=' '; } b[j]='\0'; printf("%s",b); }
设有一数列,包含10 个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列。进行逆序处理时要求使用指针方法(例如:原数列为2,4,6,8,10,12,14,16,18,20,若要求把从第4个数开始的5个数按逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20。)
#include <iostream.h> void method(int n,int m,int *a) { int *p=a,*q=new int[m]; p=p+n-1; for(int i=0;i<m;i++) { q[i]=*p; p++; } p=p-m; for(i=0;i<m;i++) { *p=q[m-1-i]; p++; } } int main() { int a[10]={2,4,6,8,10,12,14,16,18,20}; method(4,5,a); for(int i=0;i<10;i++) { cout<<a[i]<<' '; } return 0; }
有一字符串,包含n个字符。写一个函数,将此字符串从第m个字符开始的全部字符复制成为另一个字符串并输出
void strcpyn(char *s,char *t, int n) { char *p=s+n; char *q=t; while(*p) { *q=*p; q++; p++; } *q='\0'; } int main() { char s[100]={0}; char t[100]={0}; int n=0; printf("input string s:\n"); scanf("%s",s); printf("input start n:\n"); scanf("%d",&n); strcpyn(s,t,n); puts(t); }
设计函数char *insert(s1,s2,n),用指针实现在字符串s1中的指定位置n处插入字符串s2
#include <stdio.h> char* insert(char* s1,char* s2,int n) { int j=0; char* ss=new char[100]; char* tsptr=ss; for(int i=0;i<n;i++) *ss++=*s1++; while(*s2!='\0') *ss++=*s2++; while(*s1!='\0') { *ss++=*s1++; } *ss='\0'; return tsptr; } void main() { char s1[]="123456789"; char s2[]="1234"; char* ss=insert(s1,s2,4); printf("%s",ss); }
利用指针完成字符串复制函数char *strcpy(char *s1,char *s2)
#include "stdio.h" char* fun(char *s1,char *s2) { char *p=s2; while((*s1)!='\0') { *s2=*s1; s1++,s2++; } return p; } void main(void) { char *p,*strcpy; char *s1="world cup!"; char *s2="good luck!"; printf("s1=%s\ns2=%s\n",s1,s2); p=fun(s1,s2); printf("s1=%s\ns2=%s\n",s1,s2) }
- 编写一个使用指针的c函数,交换数组a和数组b中的对应元素
#include<stdio.h> #include<stdlib.h> void ex(int *a, int *b, int n){ int i,tmp; for (i=0;i<n;i++){ tmp=a[i];a[i]=b[i];b[i]=tmp; } } void main() { int x[5]={1,2,3,4,5}; int y[5]={6,7,8,9,10}; int i,n=5; ex(x,y,n); printf("\n X: "); for (i=0;i<n;i++)printf("%d ",x[i]); printf("\n Y: "); for (i=0;i<n;i++)printf("%d ",y[i]); system("pause"); }
-
c语言指针例题
2013-03-18 21:07:21(3)在第(2)小题的基础上,保持reverse函数不改动,将主程序中实参改为采用指针变量形式实现 void reverse(int *p) { int t,i,j; for (i=0,j=N-1;i;i++,j--) { t=*(p+i); *(p+i)=*(p+j...第一题:
int main() {
double salarys[5] = { 1500, 2000.43, 1202.78, 8000.32, 5000 };
int i = 0;
for (i = 0; i < 5; i++) {
printf("%6.2lf\n", salarys[i]);
}
int *p;
p = &salarys;
int *m;
m = &salarys[0];
printf("%x\n", p);
printf("%x\n", m);
int *n;
n = &salarys[4];
printf("%x\n", n);
printf("%x\n", &salarys[4]);
double *head;
head = &salarys;
double *tail = &salarys[4];
printf("%x\n", head);
printf("%x\n", tail);
printf("%6.2lf\n", *head);
printf("%6.2lf\n", *tail);
printf("%x\n", tail - head);
*head = salarys[0] - 50;
printf("%6.2lf\n", *head);
printf("%6.2lf\n", *head + 6550.32);
head = &salarys;
for (i = 0; i < 5; i++) {
printf("%6.2lf\n", *(head + i));
}
tail = &salarys;
for (i = 4; i >= 0; i--) {
printf("%6.2lf\n", *(tail + i));
}
return EXIT_SUCCESS;
}
第二题:
编写一个函数,此函数能够接收下面所有数据类型变量的地址,并能够在函数中将其值打印。
int main(){
int a = 1;
char c = 'c';
float f = 11.11;
double d = 22.222;
void *p,*p1,*p2,*p3;
p = &a;
printf("%d\n", *((int*)p));
p1 = &c;
printf("%d\n", *((char*)p1));
p2 = &f;
printf("%2.2lf\n", *((float*)p2));
p3 = &d;
printf("%2.4lf\n", *((double*)p3));
return EXIT_SUCCESS;
}
第三题:
从键盘输入一个字符串,按照字符顺序从小到大进行排序,并要求删除重复
的字符。
void f(char *str) {
char *p, *q, *r, c;
for (p = str; *p; p++) {
for (r = p, q = p + 1; *q; q++)
if (*r > *q)
r = q;
if (r != p) {
c = *r;
*r = *p;
*p = c;
}
}
for (p = str; *p; p++) {
for (q = p + 1; *q && *q == *p; q++)
strcpy(p, q--);
}
}
int main() {
char s[100];
printf("请输入一个字符串:\n");
fflush(stdout);
gets(s);
f(s);
printf("结果为:\n%s\n", s);
return EXIT_SUCCESS;
}
第四题:
有n 个人围成一个圆圈,顺序排号,从第一个人开始报数(从1 到3 报数),
凡报到3 的人退出圈子,问最后留下的是原来的第几号?
int i, k, m, n, num[50], *p;
printf("请输入一共有多少人:\n");
fflush(stdout);
scanf("%d", &n);
p = num;
for (i = 0; i < n; i++)
*(p + i) = i + 1;
i = 0;
k = 0;
m = 0;
while (m < n - 1) {
if ((*(p + i)) != 0) {
k++;
}
if (k == 3) {
*(p + i) = 0;
k = 0;
m++;
}
i++;
if (i == n)
i = 0;
}
while (*p == 0)
p++;
printf("最后留下的是原来的第%d号!\n", *p);
第五题:
编写一个函数findstr(char
*str,char *substr),该函数统计一个长度为2 的子字符串在另一个字符串中出
现的次数。
int findStr(char *str, char *substr) {
int cnt = 0;
while (*str != '\0') {
if (*substr != *str) {
str++;
continue;
} else if (*substr == *str) {
str++;
substr++;
if (*substr == *str) {
cnt++;
str++;
substr--;
} else {
substr--;
continue;
}
}
}
return cnt;
}
int main() {
char str1[100], str2[20], c;
printf("输入原字符串:\n");
fflush(stdout);
gets(str1);
printf("输入子字符串:\n");
fflush(stdout);
gets(str2);
c = findStr(str1, str2);
printf("子字符串在原字符串中出现的次数为:\n%d次!\n", c);
return 0;
}
第六题:
编写程序实现如下功能:输入一个整数字符串转换为一个整数值,如”1234”
转换为1234,”-1234”转换为-1234。
int main(void) {
char s[60];
int n;
long chnum(char *p);
printf("输入一个字符串:\n");
fflush(stdout);
gets(s);
if (*s == '-')
n = -chnum(s + 1);
else
n = chnum(s);
printf("将一个整数字符串转换为一个整数值为:\n%d\n", n);
return 0;
}
long chnum(char *p) {
long sum = 0;
while (*p) {
if (*p >= '0' && *p <= '9')
sum = sum * 10 + *p - '0';
p++;
}
return sum;
}
第七题:
void IntPoint(int * s, int * e, int i) {
while (s != e) {
*s = i;
s++;
}
*e = i;
}
int main() {
int a[10] = { 0 };
int i;
IntPoint(a, a + 9, 10); // 尾指针为 a + 9 ,不是 a + 10
for (i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
return 0;
}
第八题:
从键盘输入一个n×n 的二维数组(n 键盘输入),找出此二维数组中各行的
最大值,并按从大到小的次序输出各行的最大值及此值所在的行号
int main(void)
{
int a[80][80],b[80],c[80];//定义b数组保存各行最大值,c数组保存各行行号
int n,i,j,k=0,l=0,index,max,temp;
scanf("%d",&n);
printf("请输入%d阶矩阵:",n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
{
max=a[i][0];
for(j=1;j<n;j++)
if(a[i][j]>max) max=a[i][j];
b[k++]=max;//记录此行的最大值
c[l++]=i+1;//记录这时的行号
}
for(i=0;i<n-1;i++)//选择排序
{
index=i;
for(j=i+1;j<n;j++)
if(b[j]>b[index]) index=j;
if(index==i) continue;
temp=b[index];
b[index]=b[i];
b[i]=temp;
temp=c[index];//交换最大值时别忘了交换相应的行号
c[index]=c[i];
c[i]=temp;
}
printf("每行最大数排序后:\n");
for(i=0;i<n;i++)
printf("%-4d在第%2d行\n",b[i],c[i]);
return 0;
}
第九题:
(2)将reverse函数形参改为采用指针变量形式实现
void reverse(int *p) {
int t, i, j;
for (i = 0, j = N - 1; i < j; i++, j--) {
t = *(p + i);
*(p + i) = *(p + j);
*(p + j) = t;
}
}
int main() {
int i, b[N] = { 98, 76, 68, 65, 57, 53, 45, 43, 32, 29 };
reverse(b);
for (i = 0; i < N; i++)
printf("b[%d]=%d\n", i, b[i]);
return EXIT_SUCCESS;
}
(3)在第(2)小题的基础上,保持reverse函数不改动,将主程序中实参改为采用指针变量形式实现
void reverse(int *p)
{
int t,i,j;
for (i=0,j=N-1;i<j;i++,j--)
{
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
}
int main()
{
int i, b[N]={98,76,68,65,57,53,45,43,32,29};
int *a=b;
reverse(a);
for (i=0;i<N; i++)
printf("b[%d]=%d\n", i, b[i]);
return EXIT_SUCCESS;
} -
C语言程序第十章 指针_c语言指针例题
2020-01-15 21:08:1610.5 指针与字符串 字符串表示形式 用字符数组实现 例 main( ) { char string[]=I love China; printf%s\n,string; printf%s\n,string+7; } I l o v e C h i string[0] string[1] string[2] string[3] string[4] ... -
c语言指针例题解答
2017-10-18 00:21:30首先char*c[]为一个指针数组,对吧,这个相信大家都能看懂,千万不要把指针数组和数组指针搞混乱了。 首先先给大家讲解下什么是指针数组,什么又是数组指针呢? eg:char *c[5] 因为[]的优先级高于*,所以c先与[]...```
这个文字排版我都看不下去了,点击新连接,前去新排版------->>点击此处
ps: 新排版更适合阅读呢~
---
首先char*c[]为一个指针数组,对吧,这个相信大家都能看懂,千万不要把指针数组和数组指针搞混乱了。
首先先给大家讲解下什么是指针数组,什么又是数组指针呢?
eg:char *c[5] 因为[]的优先级高于*,所以c先与[]结合形成一个数组,类型为char* 类型,大小为5。里面存放属于char类型的指针。其实数组指针和二维指针有一定的相似之处,如果感兴趣,大家可以百度什么是二维指针,在以后的篇幅里,我也会详细给大家解释什么是二维指针,他们的联系是什么,区别又是什么呢?
而对于char(*c)[5] 因为()的优先级最高,所以c先和*形成一个指针,然后再与数组结合,这就形成了数组指针,即为指向数组的指针。它指向包含5个char类型元素的一维数组,此时c的增量以它所指向的一维数组长度为单位;
好了 弄懂了数组指针和指针数组,那么接下来继续解答该道题。
看这句代码,char**cp[]={c+3,c+2,c+1,c};
仔细看看,这里的**cp[]比上面的*c多了一个*。不知道大家看到这里有没有点疑惑呢?
多一个*号那他又代表什么呢?我来给大家举一个简单的例子吧。
char a='a';
char *b=&a;
上面这个代码的很简单吧!先定义了一个char变量,再由b指向a的地址。也就是说b里面存放的数据是变量a的地址。那么接下来就简单了,
再回到原题,char**cp[]也比char*c[]多一个*,那么不用说,cp[]里面也是存放着c[]的地址吧。看看cp[]里面的元素,c+3,c+2...果然是地址吧。
这里大家又有疑问了,为什么c+3是一个地址?那你们听说过 “数组名可看做一个地址”这句话吧!,那就对了,虽然c[]是个指针数组,那他仍然是个数组啊!!这就不难理解c+3,c+2等地址了吧。这里大家谨记可以吧数组名看做指针,但是数组名与指针又不是完全等价的!这个以后慢慢详解。那么接下来回到原题,看第三句,char***cpp=cp;
这句话我想很好理解吧!他是把一个存放指针数组地址的数组显式转化为一个指针。emmmmm,是不是有点头晕,转化来转化去的。看看他有3个*号,你就知道他是个三级指针了。
接下来看第一句printf, 参数是**++cpp;首先大家要知道输出三级指针指向的内容,他两个*又代表什么。
首先先看cpp前面有个++,什么意思呢?大家看看第三句代码,cpp指向cp,那么++cpp是不是就是cp[1]的地址啊,肯定是的。然后带个*号,取到cp[1]的值,而cp[1]的值是c+2,同时c+2又是一个地址,请大家好像体会这句话,给一个指针变量前面加一个*号就是表示他指针指向地址的值,那么这就很好理解**++cpp了。先是++cpp获取到cp[1]的地址,要获取cp[1]指向的内容再给前面加个*号就可以了,即*++cpp 就代表cp[1],即c+2。而c+2也是一个地址,要获取到c+2这个地址指向的内容,那再给前面加个*号就可以了。即为**++cpp;
这样**++cpp就代表指针数组c的第三个元素了,是一个字符串“world”,%s接收到这个字符串会把它都输出出来。即第一个printf打印WORLD.
举个简单的例子,给你们提个问题。
int a[5]={1,2,3,4,5}
int *p=a;
p++;//1
a++;//2
这两个哪个正确呢?
1是正确的2是错误的。
要取到里面的元素 *(p),*(p+1)......;注意看这里也带个*,这个代码的意义是把数组显式转化为一个指针!,再结合图片的第二行和第三行,你现在应该清楚他的作用了吧。对,就是将数组显式转化为一个同维度的指针。。。好累明天继续更博。
接下来回到问题,因为经过第一句**++cpp完后,cpp已经指向了cp[1],再次的*++cpp同样的道理,获取到cp[2]的元素,即c+1这个地址。然后再--,即为c这个地址,再带个*号,即为c这个地址下代表的值,其实也可以这么说,可以把指针数组看成一个二维数组。可以写成这样c[5][4]。那么c此时代表的值应该是二维数组的第一行吧。即c[0]。即此时为“hello”,别忘记了,后面还有个+3呢。因为hello本身也是个地址,如果大家再此又困惑,我给大家举了一个简单的例子。希望大家能认真看下帮助理解。
%s这个格式控制符需要接收一个字符串地址,c[0]地址获取到了,他就会把c[0]输出,这里给大家提个问题。他获取到c[0]地址后,会不会也把c[1]也输出出来呢?
哈哈 ,不要困惑了。并不会的。因为c[0]这个字符串“hello\0”,他会有个默认的'\0'结束符,结束%s的获取。我为什么会问这样的问题。因为要是同样的问题 遇到了二维数组大家想想又是什么样的情况呢?
大家好好对比看下。针对二维数组,让%s获取到c[0]即二维数组的第一行 时,他会把整个二维数组输出出来。直到遇到c[2][2]是个默认的‘\0’结束输出。
通过一个例题 我举出这么多例子。。。。真累。不知道大家能不能理解呢?
接下来回到问题的第三个输出,参数为*cpp[-2]+3。不难理解。可以转化下,切记接下来这个让我受益终身的一句语法糖,*(a+1)等价a[1]。当你被指针搞得头大恨不得疯掉的时候,一定要想起这句语法糖。我不扯了。回到原题 。根据语法糖法则,把*cpp[-2]+3转化成**(cpp-2)+3。我想通过我这么详细的分析。这道题对大家不再有难度了吧。算了 ,送佛送到西。cpp经过上面两句已经指向了cp[2]这个地址,那么cpp-2指向cp[0]的地址没疑惑吧。然后带个*,即为*(cpp-2)即为cp[0]这个元素,即代表c+3这个地址,然后再带个*号为**(cpp+3),成为c[3]代表的元素。c+3这个地址代表的字符串是“SAYHI”,再+3,即把该字符串的地址再往后移动三位。这样就输出了“HI”。切记*(地址)=该地址指向的值。这句话可以套用。即就是这里面的地址可以是地址的地址。请各位好好理解吧。eg:*(*(地址的地址))
接下来第四句 cpp[-1][-1]大声告诉我,是什么!!!算了 ,我继续解答吧,谁让我就是这么这么好呢。老规矩,先转化成*(*(cpp-1)-1)+1;你们说下cpp此时指向谁呢?指向cp[1],如果你觉得我说错了,请好好回头仔细看看。很多人困惑了,为什么第三句输出不是移动了cpp了啊 。请你再仔细看看第一句,第二句和第三句printf里面的区别。对的,第一句第二句++cpp和第三句cpp-2是完全不相同的道理。就比如int a=1;a++和a+2能一样吗?显然是不一样的 a++后a自增为2。a+2执行完后a还是1。好了接下来回到原题。指向cp[1]后带个*号取到cp[1]的元素即为c+2又是个地址,在把这个地址--,得到c+1的地址。再带*号,得到c+1地址指向的值。为“New”,得到这个字符串地址后,再+1,输出EW。
此题结束 。答案选哪个呢?
我再问大家一个问题还是原来的那些数组,删掉那4句printf,重新写一句printf(“%c”,cpp[1][1][1])输出什么呢? 我给个答案 :输出A。
printf(“%c”,cpp[1][-1][1])又输出多少呢?答案:输出E。
请大家好好想想吧!指针的道路就是这样一步一步探索吧。我相信各位勇于尝试最终都能成为C指针高手。
我才疏学浅,如若在我的博客里发现错误,请私信或评论,我会积极修改的。我知道CSDN博客里藏龙卧虎,还望大家不吝赐教。第一次写博客,乱七八糟的,希望大家多多宽恕。
-
C语言指针的例题
2017-06-10 23:36:44题目: 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。 #include int main() { void move(int [20],int,int); int number[20],n,m,i; printf("how many numbers?...题目: 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。
#include <stdio.h>
int main()
{
void move(int [20],int,int);
int number[20],n,m,i;
printf("how many numbers?");
scanf("%d",&n);
printf("input %d numbers:\n",n);
for(i=0;i<n;i++)
scanf("%d",&number[i]);
printf("how many place you want move?");
scanf("%d",&m);
move(number,n,m);
printf("Now,they are:\n");
for(i=0;i<n;i++)
printf("%d ",number[i]);
printf("\n");
return 0;
}
void move(int array[20],int n,int m)
{
int *p,array_end;
array_end=*(array+n-1); // 把原数组中最后一个数赋值给array_end。 这里的*(array+n-1)就等价于array[n-1];
for(p=array+n-1;p>array;p--){
*p=*(p-1); //这个循环函数的功能是把数组中所有的数向后移动一位。
printf("%d ",*p);
}
printf("\n");
printf("%d \n",array_end);
*array=array_end; //把之前数组中最后一个数赋值给移动后第一位空缺的位置。 array是数组名,*array就代表数组的第一位。
printf("%d \n",*array);
m--; // 因为移动m位,所以要迭代m次。
if(m>0)
move(array,n,m);
} -
C语言经典指针例题
2018-11-23 11:55:31经典指针例题: main(){ int va[10],vb[10],*pa,*pb,i; pa=va; pb=vb; for(i=0;i<3;i++,pa++,pb++){ *pa=i; pb=2i; printf("%d\t%d\n",*pa,*pb); } pa=&va[0]; pb=&vb[0]; printf... -
【C语言】指针例题解析
2017-08-05 21:54:36指针例题 指针加减整数 由例题可以知道,指针的类型决定指针能走多长。 指针不仅有数组指针,函数指针,还有更为复杂的指向函数指针的数组的指针。能够学好指针就能把C语言用好用活。 笔试题解析 指针... -
C语言 指针经典例题案例详解
2019-09-12 21:42:19//要求:利用字符串指针和指针数组完成。 char *array[5]={"yangmufa","shuai","de","chaojishuai",}\ ,(*tem)=NULL,t[5]={NULL}; int i=0,j=0,k=0; for(i=0;i;i++){//i表示从第一个开始到倒数第二个结束(4个... -
C语言的指针例题
2013-03-15 09:06:03(1)定义一个double类型的指针head,并初始化为NULL。 (2)定义一个double类型的变量salary,并初始化为8000.75,让head指向salary。 (3)使用&显示变量salary所占内存的地址值。 (4)使用head显示salary所占... -
C语言——例题
2018-08-25 20:54:00例1-写一个函数,输入一行字符,将此字符串中最长的单词输出。 例2-建立一个对象数组,内放5个学生的数据(学号、成绩),用指针指向数组首元素,输出第一、三、五个学生的数据。 -