user-0 提问: c指针求教

回复:
user: user-1
content: 这个是memcpy的百度介绍，你可以看看，这个要拷贝指针空间的话，建议使用memcpy这个可以更加便捷的拷贝过去，使用指针的话，只是一个地址的传递，可能会在后面一不小心就失误而丢掉了这个地址，所以这个地址传递最好用memcpy函数代替。

user: user-2
content: int a[5] = {1,2,3,4,5}; int b[5] = {6,7,8,9,0};  void copy_a(int *p) { 	//p=a; 	memcpy(p, a, sizeof(a)); }  int show_b(int *p, int len) { 	int i=0; 	for(; i<len; i++) 		printf("%d ", p[i]); 	printf("\n"); }  int main(int argc, char **argv) { 	printf("a:"); 	show_b(a, 5); 	printf("b:"); 	show_b(b, 5); 	 	copy_a(b); 	printf("\ncopy afer b:"); 	show_b(b, 5); 	 	return 0; } 经过验证，这种方法是可行的，你可以参照下

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-4
content: 直接赋值、引用不就完了吗？

user: user-5
content: 引用 5 楼 weixin_39587157 的回复:#include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); } 这样改一样不可以。 建议使用memcpy或者 void copy_a(int *p，int  *a， int size)  {     int i;     for (i = 0; i < size; i++)         p[i] = a[i]; } int main() { copy_a(b, a, 5); }

user: user-6
content: 引用 15 楼 xiejianjun417 的回复:[quote=引用 5 楼 weixin_39587157 的回复:] #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); } a本来就是全局变量，何来的未定义？请弄清楚，全局变量与局部变量的定义和区别[/quote]  好吧！ 嘻嘻，可能几不清楚咯！ 普通局部变量，作用于他定义的函数中，用完就释放它开辟的内存 静态局部变量，作用于它定义的函数中，用完不释放内存，一直占用着 普通全局变量，作用于程序所有地方，一直存在，直到程序结束后释放内存 静态全局变量，作用于程序所有地方，一直存在，直到关闭程序后释放内存 有点模模糊糊 不知道记不记错

user: user-7
content: 引用 5 楼 weixin_39587157 的回复:#include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); } a本来就是全局变量，何来的未定义？请弄清楚，全局变量与局部变量的定义和区别

user: user-7
content: 引用 楼主 ZK880127 的回复:想把a里的东西考进b里，这样为什么不行？  #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { 	p = a; } int main() { 	copy_a(b); } 你这样的做法，只是将临时指针变量p指向了a数组的首地址。函数调用参数传递，本质都是值传递，对于指针而言，只不过传递的是地址而已。 举例： 执行copy_a(b);时，会分配一个指向int型的指针变量p(栈变量(临时变量))，然后会把数组b的首地址赋值给变量p，而执行p=a时，只是将a的地址赋值给p。而数组a和b的数据未做任何改变

user: user-7
content: 代码及测试结果如下： #include <stdio.h>  int a[] = {1,2,3,4,5}; int b[] = {9,8,7,6,5};  void copy_a(int *pB, int *pA, int count) {     for (int i = 0; i < count; i++)     {         pB[i] = pA[i];     } }  void printArray(const char *msg, int *array, int count) {     printf("%s: ", msg);     for (int i = 0; i < count; i++)     {         printf("%d ", array[i]);     }     printf("\n"); }  int main(void) {     printArray("b", b, 5);     copy_a(b, a, 5);     printArray("b", b, 5);     return 0; }

user: user-6
content: 引用 11 楼 cfjtaishan 的回复:[quote=引用 7 楼 weixin_39587157 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 weixin_39587157 的回复:] #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); } 这样改一样不可以。 建议使用memcpy或者 void copy_a(int *p，int  *a， int size)  {     int i;     for (i = 0; i < size; i++)         p[i] = a[i]; } int main() { copy_a(b, a, 5); } [/quote]  还是不对 p[i] = a[i]; 这里只是改变指针p的指向，没有给main函数的b赋值 要改为*p[i] = *a[i];[/quote] 个人建议，理论应该和实践多做结合。对与不对，试了就知道了。[/quote] 嗯嗯，你的是对的。不好意思没注意p[i]等于*(p+i)嘻嘻，不过总的来说 要想改变主调函数中变量的值，必须传变量的地址，而且还得通过*+地址 去赋值，只是写的形式不同而已。

user: user-5
content: 引用 7 楼 weixin_39587157 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 weixin_39587157 的回复:] #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); } 这样改一样不可以。 建议使用memcpy或者 void copy_a(int *p，int  *a， int size)  {     int i;     for (i = 0; i < size; i++)         p[i] = a[i]; } int main() { copy_a(b, a, 5); } [/quote]  还是不对 p[i] = a[i]; 这里只是改变指针p的指向，没有给main函数的b赋值 要改为*p[i] = *a[i];[/quote] 弱弱的问一下，你有没有在编译环境里试一试？这是一重指针，为啥要用*p[i] = *a[i]呢？ 但从理论分析上，*p[i]是什么？p是一重指针，那么p[i]就是*(p + i);就是b数组第i的下表对应的值，加上*怎么理解了呢？

user: user-5
content: 引用 7 楼 weixin_39587157 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 weixin_39587157 的回复:] #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); } 这样改一样不可以。 建议使用memcpy或者 void copy_a(int *p，int  *a， int size)  {     int i;     for (i = 0; i < size; i++)         p[i] = a[i]; } int main() { copy_a(b, a, 5); } [/quote]  还是不对 p[i] = a[i]; 这里只是改变指针p的指向，没有给main函数的b赋值 要改为*p[i] = *a[i];[/quote] 个人建议，理论应该和实践多做结合。对与不对，试了就知道了。

user: user-6
content: 总的来说 要想改变主调函数中变量的值，必须传变量的地址，而且还得通过*+地址 去赋值。

user: user-6
content: 引用 6 楼 cfjtaishan 的回复:[quote=引用 5 楼 weixin_39587157 的回复:] #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); } 这样改一样不可以。 建议使用memcpy或者 void copy_a(int *p，int  *a， int size)  {     int i;     for (i = 0; i < size; i++)         p[i] = a[i]; } int main() { copy_a(b, a, 5); } [/quote]  还是不对 p[i] = a[i]; 这里只是改变指针p的指向，没有给main函数的b赋值 要改为*p[i] = *a[i];

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-6
content: #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p) { p = a;//这个a都没定义，况且它是局部变量来的，与int a[5] = {1,2,3,4,5}; 中的a一点关系都没有 } int main() { copy_a(b); }   改为 #include <stdio.h>  int a[5] = {1,2,3,4,5}; int b[5] = {9,8,7,6,5};  void copy_a(int *p，int  *a)  { p = a; } int main() { copy_a(b,a); }

user: user-8
content: 引用 2 楼 松下三三的回复:p指向了a，b传进去，b没有指向a是吗？指针也存在值传递的情况吗  [quote=引用 1 楼 paschen 的回复:] p = a只是在赋值，让p指向a的内存，不是在拷贝，而且你形参p与实参b也不是同一个变量   如果你要拷贝，copy_a函数改成：memcpy(p, a, sizeof(a)); 引用 1 楼 paschen 的回复:p = a只是在赋值，让p指向a的内存，不是在拷贝，而且你形参p与实参b也不是同一个变量   如果你要拷贝，copy_a函数改成：memcpy(p, a, sizeof(a));[/quote] p是指向了a，但p和b是不是一个变量，你函数参数是按值传递的，也就是说参数只是复制的一个对象，你对他赋值了只会影响它自己，和b没什么关系

user: user-9
content: 引用 2 楼 ZK880127 的回复:p指向了a，b传进去，b没有指向a是吗？指针也存在值传递的情况吗  [quote=引用 1 楼 paschen 的回复:] p = a只是在赋值，让p指向a的内存，不是在拷贝，而且你形参p与实参b也不是同一个变量     如果你要拷贝，copy_a函数改成：memcpy(p, a, sizeof(a)); 引用 1 楼 paschen 的回复:p = a只是在赋值，让p指向a的内存，不是在拷贝，而且你形参p与实参b也不是同一个变量   如果你要拷贝，copy_a函数改成：memcpy(p, a, sizeof(a));[/quote]  1.包括指针在内的传递实质上都是值传递，用指针作实参传递时传递的是指针的内容也即地址，再通过*pointer就能操作指针所指向的地址里的内容，在这个过程中也是生成一个指针副本，将实参值传递给副本 2.你的b是一个常量指针，你所希望的对b进行赋值的操作是错误的

user: user-0
content: p指向了a，b传进去，b没有指向a是吗？指针也存在值传递的情况吗  引用 1 楼 paschen 的回复:p = a只是在赋值，让p指向a的内存，不是在拷贝，而且你形参p与实参b也不是同一个变量   如果你要拷贝，copy_a函数改成：memcpy(p, a, sizeof(a)); 引用 1 楼 paschen 的回复:p = a只是在赋值，让p指向a的内存，不是在拷贝，而且你形参p与实参b也不是同一个变量   如果你要拷贝，copy_a函数改成：memcpy(p, a, sizeof(a));

user: user-8
content: p = a只是在赋值，让p指向a的内存，不是在拷贝，而且你形参p与实参b也不是同一个变量   如果你要拷贝，copy_a函数改成：memcpy(p, a, sizeof(a));