当前位置:首页 » 编程语言 » c语言指针和函数的问题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言指针和函数的问题

发布时间: 2022-04-16 23:40:11

c语言指针和函数题目

指针实际就是实体的代表而已,不过指针是个实体的存放地址;可以进行地址运算;
如:p++,指针指向下一地址;p=q以q指针指向地址作为p指针的地址;
普通的用法是,声明实体或实体数组,用指针指向实体的地址:实体 b,g[8],*p;
p=&b;数组名称实际就是固定长度的指针,所以常有:p=g;p=g+2相当于p=&g[2];
如函数 void fun(int b[]);可以用int *p;fun(p)来调用;p代表数组b;
如函数 void fun(int *p);可以用int b[6];fun(b)来调用;b相当于指针p;

⑵ c语言,函数里的指针问题

这个其实很好理解
只需要把%s,%c,%p放在一起看
首先%s是最常见的很好理解,就是告诉程序后面的变量是一个字符串,在C语言中也就是字符数组,类型是char*或者char[],换句话说,你告诉程序我会给你一个指针,你去读这个指针指向的值。
然后%c是告诉程序后面的变量是个字符,类型是char,差别已经很明显了,这时候你告诉程序我给你提供一个字符,你给我在%c处打印出来。然而你给的却是一个指针,那程序就直接把你给的指针指向的地址本身当成字符打印出来了。但是一个地址肯定不止一个字节,也就是说超过了char应该有的大小,这时候程序会直接忽略了超出大小的部分,只读第一个字节。
如果你同时使用%p,告诉程序,你会提供一个指针,直接把这个指针指向的地址给我打印出来。把输出的地址最后两位的16进制数查ascii表,换算成字符,你会发现,刚好就是前面%c打印出的字符。

⑶ c语言 指针 函数 问题

1.值传递
void swapl(int x, int y);
x和y的值等于a和b,但是他们在内存中地址和a b并不一样,x和y是在函数swapl内重新申请的两块新内存空间。所以你这里交换的实际上是另两处地址的值,而不是a b,从而不能达到交换的结果。

2.地址传递
void swap(int *p, int *q);
指针p q指向a b,操作他们就是操作a b两块内存了,所以能到到交换的结果。

希望对楼主有所帮助!答题不易,如果觉得可以,请采纳,谢谢!

⑷ C语言指针调用函数问题,急求解释(本题是《c和指针》上的题目)

我不清楚你的疑问到底指哪些。我就你写的这些代码解读:
int read_column_numbers(int columns[], int max)函数功能:
传参数组首地址,及数组最大长度。
用户输入max个整数,只保存其中的正整数(负数忽略),如果正整数的个数是偶数则返回个数。否则程序结束。
void rearrange(char *output,char const *input,int n_columns, int const columns[])函数功能:
传参 数组output首地址 , 数组input首地址 ,用户输入正整数个数,正整数数组
迭代数组,根据用户的输入的数字作为input起始下标,复制并拼接到数组output中(具体逻辑我不研究了)。
strncpy(output + output_col,input + columns[col],nchars)这里就是就是拼接复制,变量output_col记录的是output 已保存字符长度,output + output_col就是每次接在已有字符后面放复制的字符。input + columns[col]是用户输入的数字作为起始位置的偏移量取nchars个字符复制到output 中。
总结:
一、
首先数组名作为参数传递,无论形参定义是指针还是数组(int *columns 和 int columns[ ]效果是一样的),最终都是传地址。
二、
数组形参定义char const *,修饰符const表示常量不可修改,这里const修饰的是*input,表示数组指针指向的地址内容不能修改,但是数组指针本身值可以修改。也就是说函数中可以改变input指向的地址(比如input++),但是不能改变其指向的值(比如input[0]='A')。

⑸ C语言指针函数问题

#include<stdio.h>
char*test(void);
intmain(void)
{
char*ch;
ch=test();
puts(ch);
getchar();
return0;
}
//你的用法严格来讲是错误的
char*test(void)
{
inti=0;
charch[20];//ch是程序分配在栈上的数组
while((ch[i++]=getchar())!=' ');
ch[i]='';
returnch;//函数结束之后ch就不再存在ch以前住的地方是一堆垃圾数据
}
//一般的用法把数组用作参数
voidtest(charch[])
{
inti=0;

//有限的输入小心数组越界
while((ch[i++]=getchar())!=' ');
ch[i]='';
returnch;
}
//二般用法
char*test(void)
{
inti=0;
char*ch=0;

//可以分配堆上的内存给ch使用malloc函数在stdlib
ch=(char*)malloc(sizeof(char)*20);
while((ch[i++]=getchar())!=' ');
ch[i]='';
returnch;//返回堆上的指针函数结束后数据依然存在不过用完要free
}

⑹ C语言指针和函数的问题。!~~

这么给你解释吧,指针就相当是一个门牌号。第一个呢,是因为f()函数的参数是指针,就是“门牌号”,所以他们交换的时候是把门牌号进行了交换。所以当你第二次进行访问的时候,原来A房间变成了B房间,所以当你想要让A房间里的人出来的时候,这个时候原来住在里面的B君就出来了。所以发生了交换。
第二个呢,传的是形参,形参就是把A君复制一个(我们理解为克隆一个A君),然后克隆一个B君,最后把克隆人交换。然后我们输出的时候,我们却要A房间里的人,那个时候,A君还在自己的房间,当然他们出来的时候,就是没有交换了。如果,要交换,我们可以输出克隆人。那么看到的结果就是已经发生了交换。
我把第二个代码,给你稍微改下,就是输出克隆人,那么你就会看到,我们原来交换的只是克隆人了。
============
第二个
#include
void main()
{void f(int x,int y);
int a,b;
scanf("%d,%d",&a,&b);
f(a,b);
}
void f(int x,int y)
{int p;
p=x;
x=y;
y=p;
printf("%d,%d",x,y);
}
输入5,9
输出9,5
===========

有不明白的继续追问!

⑺ C语言中一个关于指针与函数的问题

这个原因很简单.
因你的程序是单线程/单任务
且在你p=f1();后,没有执行过其它任何程序
p指向的内存的值没有被改变,所以结果是正确的
若你再定义一个函数,如
int
ttt()
{
int
x[10],i;
for(i=0;i<10;i++)
x[i]=i;
}
而你在
p=f1();
后面执行一下这个函数
...
p=f1();
ttt();
printf("%d\n",*p);
....
你看下结果
若程序是多线程多任务的
那情况就更复杂,你最终的*p值就不得而知了
所以C指针是有完全性问题的,程序的某些BUG就是这样产生的

⑻ C语言函数和指针的问题

第一个正如你所说。
第二个的话是个函数的定义,这种返回函数指针的类型没法直接写在函数名的前面,所以
void (*GetOperateState(void))(U8)这一行是标明了返回值是个函数指针,返回的函数指针的结构跟第一个里的一样,实际上也就是把第一个声明的函数指针给返回了。
第三个跟第一个差不多,但是0不是指入口地址为0的函数,0代表NULL,是无的意思,这个是不能被调用的。

⑼ 关于C语言指针函数的问题

char*connect(char*dst,char*src)
{
char*q,*p;
for(p=dst;*p;p++);//将p指针移动到dst数组的结束符0的位置
for(q=src;*q;q++,p++)//dst从结束符开始,src从首地址开始,一一对应传值
*p=*q;
*p=0;
returndst;
}

⑽ 关于C语言中指针函数的问题

不行, 原因是found函数已经声明成返回一个int指针的函数了,如果不声明p为指针则在p=founc(a,n)时会因为类型不匹配而报错。两种方法可以解决:1,直接省略掉变量p,在printf语句中直接用printf("%d", *found(a,n));来输出结果;2,修改found函数为:<pre t="code" l="cpp">int found(int b[10], int n)
{
return b[n-1];
}则p可以直接声明为int, 且赋值时用p=found(a,n); 输出时用printf("%d", p);可以看到这样改动的比较多。