user-0 提问: 自学新人提问：malloc,p[i]使用

回复:
user: user-0
content: 引用 8 楼 fight_in_dl 的回复:引用定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。   嗯，你说的对。这两种方式有区别。 其实原题目中动态分配的内存，没调用free也存在问题。    嗯，刚学到这，书上解释里有写调用free函数，但代码中没写。

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:[quote=引用 3 楼 fight_in_dl 的回复:] 是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。[/quote] 需要malloc之后赋值是指用malloc的返回值给p赋值吗？ int *p[5]不能直接使用scanf("%d",p+i);赋值是因为不能给指针元素赋值指针吗？

user: user-0
content: 引用 4 楼 weixin_37923716 的回复:两种都是可以，传递过去的是指针，用你的方法还更好理解  嗯，我的想法就是在不影响逻辑的情况下，能精简就精简。我自己写的时候用的*（p+i）的形式，但书上用的p[I]，结果相同，但因为之前刚读到指针数组的问题，在遇到这个代码时有点晕。

user: user-1
content: 引用定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。   嗯，你说的对。这两种方式有区别。 其实原题目中动态分配的内存，没调用free也存在问题。

user: user-2
content: 直接使用p[i],我用*(p+i)结果是一样的，这里没有什么不同 一个是靠下标指向元素的位置，一个靠内存偏移指向元素的位置。

user: user-2
content: 引用 3 楼 fight_in_dl 的回复:是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。

user: user-3
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-4
content: 两种都是可以，传递过去的是指针，用你的方法还更好理解

user: user-1
content: 是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728

user: user-0
content: 引用 13 楼 cfjtaishan 的回复:[quote=引用 10 楼 baidu_39384527 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 3 楼 fight_in_dl 的回复:] 是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。[/quote] 需要malloc之后赋值是指用malloc的返回值给p赋值吗？ int *p[5]不能直接使用scanf("%d",p+i);赋值是因为不能给指针元素赋值指针吗？ [/quote] int *p[5]是定义的5个野指针，需要将这5个指针指向一个可以读写的区域才可以。要么使用malloc，要么让这5个野指针指向栈上的某些位置。[/quote] 嗯

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:5楼正解！   涉C未深，尚不能理解

user: user-2
content: 引用 10 楼 baidu_39384527 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 3 楼 fight_in_dl 的回复:] 是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。[/quote] 需要malloc之后赋值是指用malloc的返回值给p赋值吗？ int *p[5]不能直接使用scanf("%d",p+i);赋值是因为不能给指针元素赋值指针吗？ [/quote] int *p[5]是定义的5个野指针，需要将这5个指针指向一个可以读写的区域才可以。要么使用malloc，要么让这5个野指针指向栈上的某些位置。

user: user-3
content: 5楼正解！

user: user-0
content: 引用 1 楼 fight_in_dl 的回复:编译器总是把以下标的形式的操作解析为以指针的形式的操作。 p[i]这个操作会被解析成：先取出p 里存储的地址值，然后加上中括号中i个元素的偏移量，计算出新的地址， 然后从新的地址中取出值。也就是说以下标的形式访问在本质上与以指针的形式访问没有区别，只是写法上不同罢了。  从抽象的角度理解，指针和数组是外在形式，本质上都是对内存地址的读写操作。  如果有帮助，请采纳答案好吗，谢谢！  这里的p[I]和指针数组p[I]怎么做区别？数组加下标和指针加下标的使用有点模糊。

user: user-1
content: 编译器总是把以下标的形式的操作解析为以指针的形式的操作。 p[i]这个操作会被解析成：先取出p 里存储的地址值，然后加上中括号中i个元素的偏移量，计算出新的地址， 然后从新的地址中取出值。也就是说以下标的形式访问在本质上与以指针的形式访问没有区别，只是写法上不同罢了。  从抽象的角度理解，指针和数组是外在形式，本质上都是对内存地址的读写操作。  如果有帮助，请采纳答案好吗，谢谢！