- 乘法(数学运算子)
- int* x (指标变数)
- Void add(int* x) (函式引数)
- *x (取指标指向变数的值)
以下针对2-4的程式的写法
void add(int *x, int *y)// 3. 函式内的引数
{
printf("sum = %d\n", *x + *y); //指标指向的数值相加
}
int main()
{
int num1 = 2, num2 = 3;
printf("&num1 = %p\n", &num1); // &num1 = 0x7fff34867b50
int *pi_1, *pi_2; // 2.宣告指向整数的指标
pi_1 = &num1; //用指标pi_1指向num1的位址
pi_2 = &num2; //用指标pi_2指向num2的位址
printf("pi_1 = %d\n", *pi_1); // pi_1 = 2 (4.用*取指标指向变数的值)
printf("&pi_1 = %p\n", &pi_1); // &pi_1 = 0x7ffe140a9f68
add(pi_1, pi_2); // sum = 5
指标变数
若将变数宣告为指标变数, 则操作都变成记忆体操作
int* x=0; //x initial一个int记忆体空间(4 byte)在记忆体位置=0的地方
x++ //x向前移动一个int大小的记忆体位置, 0x04
多重指标
&取变数记忆体位置
int A=2;
int *ptr1=&A; // 建立指标变数ptr1,指向变数A的位址
int **ptr2=&ptr1; //建立指标变数ptr2,指向指标变数ptr1的位址
int ***ptr3=&ptr2; // 建立指标变数ptr3,指向指标变数ptr2的位址
***ptr3=**ptr2=*ptr1=2
&用法
- and (逻辑运算子)
- 解出变数记忆体位置
- 函式使用时设为参考(reference)
解出记忆体位置
int *ptr;
int b = 10;
printf("b:%d\n", b); //b变数值:10
printf("&b:%p\n", &b); //&b:0x7ffd8bc63f5c b本身的位址
ptr = &b; // ptr指向b的位置
printf("ptr:%d\n", *ptr); //ptr:10 用*取指标指向变数的值
printf("&ptr:%p\n", &ptr); //&ptr:0x7ffd8bc63f60 ptr本身的位址
函式参考
当使用&当成函式引数前缀, 修改的值会传递回外部
void swapValue1(int a, int b) // 复制a、b数值后交换
{
int tmp = a;
a = b;
b = tmp; // 交换完的结果仅在函式内
cout << "swapValue1_a=" << a << endl;
cout << "swapValue1_b=" << b << endl;
}
void swapValue2(int &a, int &b) // 输入a、b位址
{ // &在函式(function)使用时设为参考 (reference)
int tmp = a;
a = b;
b = tmp; // a、b值互换结果在函式外仍沿用
cout << "swapValue2_a=" << a << endl;
cout << "swapValue2_b=" << b << endl;
}
int a = 5;
int b = 10;
swapValue1(a, b); //10, 5
cout << "a=" << a << endl; //5
cout << "b=" << b << endl; //10
cout << "&a=" << &a << endl; //原本a的位置
cout << "&b=" << &b << endl; //原本b的位置
swapValue2(a, b); //10, 5
cout << "a=" << a << endl; //10
cout << "b=" << b << endl; //5
cout << "&a=" << &a << endl; //原本a的位置
cout << "&b=" << &b << endl; //原本b的位置