在 WSL2 上使用 g 編譯,示例輸出為
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using std::vector;
vector <int> powers_2(const int npow) {
vector <int> v;
int j = 2;
for (int i=0; i<npow; i ) {
v.push_back(j);
j*= 2;
}
return v;
}
void pow_2(const int npow, int *v, int *nv) {
vector <int> w = powers_2(npow);
*nv = w.size();
v = (int*)malloc(*nv * sizeof(int));
for (int i=0; i<*nv; i ) {
v[i] = w[i];
printf("%d %d %d\n",i,v[i],w[i]);
}
}
int main() {
int *y;
int ny;
pow_2(3,y,&ny);
printf("\n in main\n");
for (int i=0; i<ny; i ) {
printf("%d %d\n",i,y[i]);
}
}
是
0 2 2
1 4 4
2 8 8
in main
0 1
1 0
2 1091723517
所以引數int* v設定在 pow_2 中,但資料沒有回傳給呼叫者。為什么?
uj5u.com熱心網友回復:
按值、按指標和按參考傳遞函式引數是有區別的。
線
pow_2(3,y,&ny);
會將 的值傳遞y給函式pow_2,這意味著y將制作變數值的副本,該副本將作為區域變數存在v于函式中pow_2。這不是您想要的,因為更改v函式中的變數pow_2只會更改該變數,但不會更改函式中原始變數y的值main。
相反,您想要的是將變數y本身而pow_2不是其值傳遞給函式,以便函式可以更改它pow_2。有兩種方法可以做到這一點。你可以傳遞變數y
- 作為參考,或
- 作為指標
到函式pow_2。
要使函式pow_2參考 anint *而不是 an 的值int *,您可以更改該行
void pow_2(const int npow, int *v, int *nv) {
到:
void pow_2(const int npow, int * &v, int *nv) {
或者,您可以使函式pow_2采用指向 a 的指標int *而不是 a 的值int *。你可以換行
void pow_2(const int npow, int *v, int *nv) {
到
void pow_2(const int npow, int **v, int *nv) {
但是,這將需要您重寫函式pow_2,以便在使用指標時參考它:
void pow_2(const int npow, int **v, int *nv) {
vector <int> w = powers_2(npow);
*nv = w.size();
*v = (int*)malloc(*nv * sizeof(int));
for (int i=0; i<*nv; i ) {
(*v)[i] = w[i];
printf("%d %d %d\n",i,(*v)[i],w[i]);
}
}
此外,您必須以不同的方式呼叫該函式。您將不得不更改線路
pow_2(3,y,&ny);
到:
pow_2(3,&y,&ny);
因此,將變數作為參考傳遞比作為指標傳遞更容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480163.html
