给定多个值的数组arr。例如-
[-3,5,1,3,2,10]
我们需要编写一个删除数组中所有负值的函数。函数完成执行后,数组应仅由正数组成。
我们需要这样做,而不创建临时数组,而仅使用pop方法删除数组中的任何值。
因此,让我们为该函数编写代码-
示例
为此的代码将是-
// strip all negatives off the end
while (xlength && x[xlength - 1] < 0) {
xpop();
}
for (var i = xlength - 1; i >= 0; i--) {
if (x[i] < 0) {
//将此元素替换为最后一个元素(保证为
positive)
x[i] = x[xlength - 1];
xpop();
}
}
输出结果
控制台中的输出将为-
[ 1, 8, 9 ]
基础教程
HTML基础教程 HTML5基础教程 HTML参考手册 SVG 教程 CSS 教程 CSS 参考手册 CSS3教程 Bootstrap3 教程 Bootstrap4 教程 Font Awesome图标 JavaScript 教程 JavaScript 参考手册 jQuery 教程 AJAX 教程 JSON 教程 AngularJS 教程 ReactJS 教程 NodeJS 教程 Python 教程 C++ 教程 Golang 教程 C 语言教程 PHP 教程 C# 教程 LINQ 教程 Lua 教程 Ruby 教程 Rust 教程 Linux 教程 R 语言教程 Docker 教程 Scala 教程 MatLab 教程 Erlang 教程 Pandas教程 Numpy教程 Matplotlib教程 Flask教程 Java 教程 SpringBoot 教程 JDBC 教程 JSP 教程 Servlet 教程 Maven 教程 Spring 教程 Django 教程 Swift 教程 Kotlin 教程 SQL 教程 MongoDB 教程 SQLite 教程 PostgreSQL 教程 MySql 教程 Redis 教程 Elasticsearch 教程
1如果是返回值是指针
char getname()
{
char pname=new char[23]; //返回指针必须是函数释放后并未释放的内存空间,
cout<<"input your name:\n"; //一般返回两种情况,一是在函数中像该函数一样动态分配堆内存
cingetline(pname,22); //二是返回指针指向参数中地址,如: int max(int a,int b) { return &a; }
pname[22]='\0';
return pname;
}
int main()
{
char name=getname();
cout<<"your name is: "<<name<<endl;
delete []name; //记得动态释放分配内存
return 0;
}
2参数是指针类型
常见的是通过指针或引用交换两个数的值
void swa(int p1,int p2)
{
int temp=p1; p1=p2; p2=temp;
}
int main()
{
int a=2,b=3;
swa(&a,&b); //传递地址
return 0;
}
附解:你可以把指针看做是一种复合类型,它之所以可以修改参数值,本质是因为
对指针解除引用p形式是 *** 作的参数所存数据内存空间,但如果它不解除引用,它
并不会修改参数的值:如
void swa(int p1,int p2) //函数意思是最初始在函数参数块中定义两个指针p1,p2,使
{ //p1指向a,p2指向b,下面函数体只是使指针指向地址改变,成了
//p1指向b,p2指向a。但并未对a,b内存空间 *** 作,当函数调用结束后,指针p1,p2
//也释放了,所以并未起任何作用
int temp;
temp=p1; p1=p2; p2=temp;
}
int main()
{
int a=2,b=3;
swa(&a,&b); //传递地址
cout<<a<<" "<<b;
return 0;
}
这个函数并不会交换a,b的值
fopen的返回值不是负数。。而是一个FILE指针。你如果硬要把指针转成整数,是有可能看到个负数,不过不代表任何意义。只要返回的不是0,就说明fopen函数调用成功了。如果造成死机,应该是你其他的代码有问题。
================================
问题补充:求助啊 ,详细讲一下啦。我这有答案,能不能讲讲过程?
大概懂了。但是A为什么错了呢
================================
如果是想求a和b所指字符串长度之差,
那么应该用strlen(a)-strlen(b)
选择D比较a和b所指字符串的大小。
讲解:
fun(char a,char b)
{
while((a!='\0')&&(b!='\0')&&(a==b)) //循环继续条件:a没有到串尾,并且b也没有到串尾,并且当前指针a和指针b所指向的字符相同
{a++;b++;} //如果a,b字符串都没有结束,并且俄当前指向的字符相同的话,那么就将指针向后移一位,继续判断后面的字符是否相同
return(a-b); //将当前指针a和指针b所指向的字符的ASCII码值的差返回
}
return(a-b);有如下4种情况:
1 字符串a结束了,但是b没有结束,也就是说b比a要长,那么a-b一定是一个负值(因为\0的ASCII码值为0,而其他字符的ASCII码值一定大于0)
2 字符串b结束了,但是a没有结束,也就是说a比b要长,那么a-b一定是一个正值(因为\0的ASCII码值为0,而其他字符的ASCII码值一定大于0)
3 字符串a结束了,字符串b也结束了,也就是说a,b一样长而且字符还都完全相同,那么a-b一定是0
4 字符串a没有结束,字符串b也没有结束,但是在之前的循环中出现a,b中的相同位置上的字符不一样的情况了,那么如果指针a所指向的字符比指针b所指向的字符大的话,a-b是一个正值;如果指针a所指向的字符比指针b所指向的字符小的话,a-b是一个负值;
所以:
如果fun()函数的返回值为正的话,说明字符串a大于b
如果fun()函数的返回值为0的话,说明字符串a等于于b
如果fun()函数的返回值为负的话,说明字符串a小于b
移动文件指针,通常需要在文件中跳转、从不同位置读取以及写入不同位置。有一些PHP 函数可以完成这些任务。
1 .将文件指针移到偏移量指定的位置
fseek()函数将指针移到给定的偏移量所指定的位置。其形式为:
int fseek (resource handle , int offset [, int whence ] )
如果忽略可选参数whence ,则位置将设置为从文件开头的offset 字节处。否则,whence 可以设置为3 个可能的值,它将影响指针的位置。
•SEEK_CUR。设置指针位置为当前位置加上offset 个字节。
•SEEK_END。设置指针位置为EOF 加上。ffset 字节。在这里,。ffset 必须设置为负值。
•SEEK_SET。设置指针位置为offset 字节处。这与忽略whence 效果相同。
2.获取当前指针的偏移量
ftell()函数获取资源中文件指针当前位置的偏移量。其形式为:
int ftell ( resource handle )
3.将文件指针移回至文件开始处
rewind() 函数将文件指针移回至资源的开头。其形式为:
int rewind ( resource handle )
看完以下的,您就知道什么是指向函数的指针了,其实就是回调函数!
程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。
声明函数指针
回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:
void f();// 函数原型
上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:
void () ();
让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:
// 获得函数指针的大小
unsigned psize = sizeof (void () ());
// 为函数指针声明类型定义
typedef void (pfv) ();
pfv是一个函数指针的自定义类型,它指向的函数没有输入参数,返回类行为void。使用这个类型定义名可以隐藏复杂的函数指针语法。
指针变量应该有一个变量名:
void (p) (); //p是指向某函数的指针
p是指向某函数的指针,该函数无输入参数,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。例如:
void func()
{
/ do something /
}
p = func;
p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。
传递回调函数的地址给调用者
现在可以将p传递给另一个函数(调用者)- caller(),它将调用p指向的函数,而此函数名是未知的:
void caller(void(ptr)())
{
ptr(); / 调用ptr指向的函数 /
}
void func();
int main()
{
p = func;
caller(p); / 传递函数地址到调用者 /
}
如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。
调用规范
到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。
将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:
// 被调用函数是以int为参数,以int为返回值
__stdcall int callee(int);
// 调用函数以函数指针为参数
void caller( __cdecl int(ptr)(int));
// 在p中企图存储被调用函数地址的非法 *** 作
__cdecl int(p)(int) = callee; // 出错
指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)