user-0 提问: C语言中为什么使用指针能节省内存？

回复:
user: user-1
content: 指针最基本也是最重要的用处就是提供一层间接。

user: user-2
content: 减少数据拷贝，直接告诉对方存放数据的地址，通过地址访问一个数据，比把数据拷贝一份给你，两个代价是不一样的

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

user: user-4
content: 建立一个错误的理论，再来问为什么这样

user: user-5
content: 这个前提不对。指针不是用来是省内存的，可以用来操作内存，不过作为函数参数传递时，会减少拷贝操作，变相的节省了内存，但是这不是目的

user: user-6
content: 指针节省内存还是主要体现在参数传递上，比如传递一个结构体指针变量和传递一个结构体变量，若结构体占用内存越大，传递指针变量约节省内存的

user: user-6
content: 这样的目的可能是不想修改str的地址，通过p可以做到遍历str字符串。

user: user-0
content: 引用 7 楼 paschen 的回复:char str = "abcd";   这句应该是   char* str = "abcd";  str和p都是指针，确实使用str就可以了  这里和节省内存没任何关系 应该是减少不必要的数据复制

user: user-7
content: 可能是说内存可以动态按需分配，如果用静态的数组，事先可能无法确定需要多大的数组，只能定义较大的数组，造成浪费。

user: user-7
content: 推荐：《深入理解C指针》

user: user-8
content: 然后你的房子太大了  交换起来不方便 不是还有房产证吗 这时候 房产证就是指针 房产证换了 房子就换了

user: user-8
content: 补充 好像还是和节省内存有关系的 呵呵  比如你的一间房子里放一堆黄金 放着放着放不下了 但是用纸币 可以放个几亿

user: user-8
content: 和节省内存没关系 和交换内存有关系 就好像纸币代表一堆黄金 就是指针代表一堆内存 交换一吨一吨的黄金很麻烦 不如用纸币代替黄金 交换一堆堆的内存很没有效率 不如直接交换指向他们的指针  并且使用指针代表他们

user: user-9
content: 还有就是用指针可以是程序的灵活性更好： http://blog.csdn.net/zhagoodwell/article/details/53512140

user: user-9
content: 用指针节省内存一般是 calloc 或者malloc 还有就是字符数组排序的时候 如果用指针指向每个字符地址 交换的时候不用交换，每个字符串 直接交换字符指针即可“ EG： # include <stdio.h>   # include <string.h>   # define N 100   //如果想录入x个字节那么就把N的数值改成x    int gainchar(char *A,int min,int max);  int gainint(int *p,int a,int b); void paixu(char *a[],int n,int F);  void main(){       int n,F,i;       char B[N][N+1],*P[N],S[][3]={"升","降"};   	do{   		printf("输入要录入的字符串个数[2,%d]:",N); 		gainint(&n,2,N); 		for(i=0;i<n;i++) 		{ 			printf("第%d个字符串,字节--[1,%d]:",N); 			gainchar(B[i],1,N); 			P[i]=B[i];//让每个指针指向每个字符数组 		} 		printf("升序请按0:降序请按1--[0,1]:");           gainint(&F,0,1); 		paixu(P,n,F); 		printf("%s后:\n",S[F]); 		for(i=0;i<n;i++) 			printf("%s\n",P[i]); 	}while(1);   }    int gainint(int *p,int a,int b)//输入int *p直至满足[a,b]输入结束，返回*p       {            do{               *p=a-1;             scanf("%d",p);               while(getchar()!='\n');               if(*p>b||*p<a)                   printf("输入有误,请重新输入(%d--%d):\n",a,b);           }while(*p>b||*p<a);           return *p;       }   int gainchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度       {           int B,C;      do{               A[max]=B=C=0;           while((A[B++]=getchar())!='\n'&&B<max);           if(A[B-1]!='\n')               while(getchar()!='\n'&&++C);           else A[--B]=0;        if(C||B&&B<min)          printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);           }while(C||B<min);           return B;     } void paixu(char *a[],int n,int F)  {       int i,j,k,Y;   	char *temp; 	for(i=0;i<n-1;i++)   	{   		k=i;   		for(j=i+1;j<n;j++)   		{             Y=strcmp(a[j],a[k]);  			if(F?Y<0:Y>0)   //b=0升序  b为其他降序   				k=j;   		} 			if(k!=i)   			{   				temp=a[k];   				a[k]=a[i];   				a[i]=temp;   			}   	}   }    这样能节省交换的运行内存和时间 希望能帮到你

user: user-10
content: char str = "abcd"; 这是定义字符的  指针只是指向内存的首地址，与节省内存没关系。 指针对比其他语言，能直接访问内存地址空间，所以效率会高点。当然使用汇编会更高。 学习C/C++，使用指针是不可避免的。

user: user-11
content: 这两个语句都有问题，你让别人怎么回答你？指针不是更省内存，而是减少内存拷贝。

user: user-12
content: https://zhidao.baidu.com/question/362521628.html 来自百度  仅供参考

user: user-13
content: char str = "abcd";   这句应该是   char* str = "abcd";  str和p都是指针，确实使用str就可以了  这里和节省内存没任何关系

user: user-14
content: char str = "abcd"; 这句话不报错？  总之使用指针跟节省内存没有半毛钱关系