⑴ 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]='