深圳蕾奥规划设计公司网站,大学计算机网页制作步骤,网站建设中的网页布局主要内容,wordpress插件的使用方法1.引入 学习指针的⽬的是使⽤指针解决问题#xff0c;那什么问题#xff0c;⾮指针不可呢#xff1f; 例如#xff1a;写⼀个函数#xff0c;交换两个整型变量的值。 ⼀番思考后#xff0c;我们可能写出这样的代码#xff1a; #include stdio.h
void Swap1(int…1.引入 学习指针的⽬的是使⽤指针解决问题那什么问题⾮指针不可呢 例如写⼀个函数交换两个整型变量的值。 ⼀番思考后我们可能写出这样的代码 #include stdio.h
void Swap1(int x, int y)
{int tmp x;x y;y tmp;
}
int main()
{int a 0;int b 0;scanf(%d %d, a, b);printf(交换前a%d b%d\n, a, b);Swap1(a, b);printf(交换后a%d b%d\n, a, b);return 0; } 当我们运⾏代码我们发现其实没产⽣交换的效果这是为什么呢 调试⼀下试试呢 我们发现在main函数内部创建了a和ba的地址是0x00cffdd0b的地址是0x00cffdc4在调⽤Swap1函数时将a和b传递给了Swap1函数在Swap1函数内部创建了形参x和y接收a和b的值但是x的地址是0x00cffcecy的地址是0x00cffcf0x和y确实接收到了a和b的值不过x的地址和a的地址不⼀样y的地址和b的地址不⼀样相当于x和y是独⽴的空间那么在Swap1函数内部交换x和y的值⾃然不会影响a和b当Swap1函数调⽤结束后回到main函数a和b的没法交换。Swap1函数在使⽤的时候是把变量本⾝直接传递给了函数这种调⽤函数的⽅式我们之前在函数的时候就知道了这种叫传值调⽤。 结论实参传递给形参的时候形参会单独创建⼀份临时空间来接收实参对形参的修改不影响实参。所以Swap是失败的了。 2.具体应用 我们现在要解决的就是当调⽤Swap函数的时候Swap函数内部操作的就是main函数中的a和b直接将a和b的值交换了。那么就可以使⽤指针了在main函数中将a和b的地址传递给Swap函数Swap函数⾥边通过地址间接的操作main函数中的a和b并达到交换的效果就好了。 #include stdio.h
void Swap2(int*px, int*py)
{int tmp 0;tmp *px;*px *py;*py tmp;
}
int main()
{int a 0;int b 0;scanf(%d %d, a, b);printf(交换前a%d b%d\n, a, b);Swap1(a, b);printf(交换后a%d b%d\n, a, b);return 0; } 我们可以看到实现成Swap2的⽅式顺利完成了任务这⾥调⽤Swap2函数的时候是将变量的地址传递给了函数这种函数调⽤⽅式叫传址调⽤。 传址调⽤可以让函数和主调函数之间建⽴真正的联系在函数内部可以修改主调函数中的变量所以未来函数中只是需要主调函数中的变量值来实现计算就可以采⽤传值调⽤。如果函数内部要修改主调函数中的变量的值就需要传址调⽤。 3.strlen的模拟实现 库函数strlen的功能是求字符串⻓度统计的是字符串中 \0 之前的字符的个数。 函数原型如下 size_t strlen ( const char * str ); 参数str接收⼀个字符串的起始地址然后开始统计字符串中 \0 之前的字符个数最终返回⻓度。 如果要模拟实现只要从起始地址开始向后逐个字符的遍历只要不是 \0 字符计数器就1这样直到 \0 就停⽌。 参考代码如下 int my_strlen(const char * str)
{int count 0;assert(str);while(*str){count;str;}return count;
}
int main()
{int len my_strlen(abcdef);printf(%d\n, len);return 0; }