嘿,我有一个程序可以检查数组中最长的序列,我需要它告诉我序列从什么时候开始,我在函数中使用了一个指针,但似乎没有更新它的值函数的指针。指针指向NULL,但最初它指向a 并且仍然没有改变。
答案 0 :(得分:0)
C使用pass by value(总是)。因此,当您通过begin
时,您传递的是begin
的值。无论您在函数A中更改多少次,begin
的值在代码调用函数A中都保持不变。
如果希望函数A在调用函数A的函数中更改begin
的值,则必须将指针传递给begin
而不是begin
的值。
像:
int longestSequence(int a[], int n, int** begin);
^^^
并将其称为
longestSequence(a, n, &begin);
在功能使用中
*begin = ....
更改值。
然后,在函数返回后,会显示更改。
答案 1 :(得分:0)
for循环也需要检查...
for(int i=0;i<n-1;i++)
{
..
}
一个想法可以帮助你更好地理解指针,它与普通变量没有什么不同(它将地址作为其值)。
现在你需要改变这个值(begin
的值),所以你需要指向它。
所以你传递开始的地址是指针
func(..,&begin);
func(...,int** begin)
{
..
}
如果我是C中的类型,那么指向我的指针将被命名为coderredoc *
,指向该指针的指针将为coderredoc **
,依此类推。
所以你想改变开始的价值你应该做什么?
您为该地址指定了任何内容.. *begin=...
+---------+
| int |address:0x7777
| begin |
+---------+
/\
|
|
-----------+--------------------------- +
| pointer to begin (pbegin) | (int*)
| 0x7777 |
+----------------------------+
int longestSequence(int a[], int n,int *elem ){
int length=1,i,maxvalue=0,lastseen=a[0],mpos=0;
for(i=1;i<n;i++)
{
if(a[i-1]==a[i])
{
length++;
}
else
{
lastseen= a[i];
if(length>maxvalue)
{
maxvalue=length;
mpos = pos;
}
pos=i;
length=1;
}
if(length>maxvalue)
{
maxvalue=length;
mpos = pos;
}
}
*elem=mpos; //mpos position of the starting of the longest sequence
return maxvalue;
}
返回最大长度,我们将指针传递给包含最大元素的整数变量。
主要致电:int legth=longestSequence(a,n,&longestSequenceElement);