Discussion:
p++
(时间太久无法回复)
Ptp
2003-11-06 22:05:16 UTC
Permalink
#include <stdio.h>

int main()
{
int i;
int *p,v,a[10];
p=a;

for (i=0;i<=9;i++)
{
*p=i*2;
p++;
­Y¥Î³o­Ó°j°é, ²Ä€G­Ó for °õŠæ·|¥X²{ Segmentation fault (core dumped)
printf("\n%d %d",a[i],i);
}

for (i=0;i<=9;i++)
{
printf("\n");
p[i]=i;
// *(p+i)=i;
// *(a+i)=i;
printf("%d %d",a[i],i);
}

return 0;
}

°õŠæ·|¥X²{ Segmentation fault (core dumped)

0 0
2 1
4 2
6 3
8 4
10 5
12 6
14 7
16 8
18 9
0 0
2 1
4 2
6 3
8 4
Segmentation fault (core dumped)



--


¡° šÓ·œ:¡Eš}¬ü®a±ÚÁ`¹ë hiperfect.com¡E[FROM: localhost]
¥S§Ì¥²³Ó
2003-11-06 23:12:08 UTC
Permalink
: 執行會出現 Segmentation fault (core dumped)
: 0 0
: 2 1
: 4 2
: 6 3
: 8 4
: 10 5
: 12 6
: 14 7
: 16 8
: 18 9
: 0 0
: 2 1
: 4 2
: 6 3
: 8 4
: Segmentation fault (core dumped)

我在vc++中執行出現的問題和你不同,
會在第二次出現0 0 之後就出問題了。
不過我想應該是p越位了^^,
你在第一個for迴圈跑完,p的值應該是a[9]的位置了,
所以我在第一個迴圈之後,再加上p=a;
就可以了。

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.71.41
K.Lee
2003-11-07 04:12:51 UTC
Permalink
Post by Ptp
#include <stdio.h>
int main()
{
int i;
int *p,v,a[10];
p=a;
for (i=0;i<=9;i++)
{
for(i=0;i<9;i++)

a[10] --> a[0] ~ a[9]

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
Ptp
2003-11-07 04:21:45 UTC
Permalink
¡i Šb ***@ptt.cc (¥S§Ì¥²³Ó) ªº€j§@€€Ž£šì: ¡j
: : Segmentation fault (core dumped)
: §ÚŠbvc++€€°õŠæ¥X²{ªº°ÝÃD©M§A€£ŠP¡A
: ·|Šb²Ä€GŠž¥X²{0 0 €§«áŽN¥X°ÝÃD€F¡C
: €£¹L§Ú·QÀ³žÓ¬Op¶VŠì€F^^¡A
: §AŠb²Ä€@­Ófor°j°é¶]§¹¡Apªº­ÈÀ³žÓ¬Oa[9]ªºŠìžm€F¡A
: ©Ò¥H§ÚŠb²Ä€@­Ó°j°é€§«á¡AŠA¥[€Wp=a;
: ŽN¥i¥H€F¡C


šº³oŒË¬ÝšÓ¬O§_ p[i] €ñ p++ Šn?
€°»ò±¡ªp€~­n¥Î p++ ?

SAMS Teach yourself C for linux ®Ñ€€²Ä 234 ­¶«ü¥X
ºâ³N«üŒÐªk€£­n»Œ©Î»ŒŽî°}ŠCªºÅÜŒÆ, šÒ

$ cat list0803.c
/* Demonstrates using pointer arithmetic to access */
/* array elements with pointer notation. */

#include <stdio.h>
#define MAX 10

/* Declare and initialize an integer array. */

int i_array[MAX] = { 0,1,2,3,4,5,6,7,8,9 };

/* Declare a pointer to int and an int variable. */

int *i_ptr, count;

/* Declare and initialize a float array. */

float f_array[MAX] = { .0, .1, .2, .3, .4, .5, .6, .7, .8, .9 };

/* Declare a pointer to float. */

float *f_ptr;

int main(void)
{
/* Initialize the pointers. */

i_ptr = i_array;
f_ptr = f_array;

/* Print the array elements. */

for (count = 0; count < MAX; count++)
printf("%d\t%f\n", *i_ptr++, *f_ptr++);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^³o€@Šæ­Y§ï¬°€U­±³oŠæŽN€£Šæ
printf("%d\t%f\n", *i_array++, *f_array++); -->€£Šæ

return 0;
}

·N«ä¬O§_ iarray, farray ¬O °}ŠCªºÅÜŒÆ
À³žÓšÏ¥Î i_ptr,f_ptr §@«üŒÐºâ³N *i_ptr++, *f_ptr++?

Šý¥t€@­Óµ{Š¡§ÚžÕ¹L¥i¥H

$ cat p.c
#include <stdio.h>

int main()
{
int *p,*q;
int a[10];
int i;

p=q=a;

for (i=0; i<10; i++)
{
a[i]=i;
printf("%d\n",*p++);
}
printf("p.q=%d\n",p-q);

p=q=a;
for (i=0; i<10; i++)
{
p[i]=i;
printf("%d\n",*a++);
^^^^^³ožÌ¥i¥H
}

printf("p.q=%d\n",p-q);

šâ­Ó®t§OŠbšºžÌ?

¡° šÓ·œ:¡Eš}¬ü®a±ÚÁ`¹ë hiperfect.com¡E[FROM: localhost]
老貢生
2003-11-07 05:32:30 UTC
Permalink
Post by Ptp
: : Segmentation fault (core dumped)
: 我在vc++中執行出現的問題和你不同,
: 會在第二次出現0 0 之後就出問題了。
: 不過我想應該是p越位了^^,
: 你在第一個for迴圈跑完,p的值應該是a[9]的位置了,
: 所以我在第一個迴圈之後,再加上p=a;
: 就可以了。
那這樣看來是否 p[i] 比 p++ 好?
什麼情況才要用 p++ ?
不是好不好的問題,而是看場合。
p[i] == p 位址 + i 個元素間隔,所以指標變數內容本身不變,
p++ move p 位址 + 一個元素間隔,所以指標變數內容改變。

有些場合你沒辦法用 p[i] ,一定要用 p++。
譬如:

int i,j,n1,n2;
int *npa,*npb;

printf("請輸入第一維元素數目:")
scanf("%d",n1);
printf("請輸入第二維元素數目:")
scanf("%d",n2);

npa=(int *)malloc(n1 * n2 * sizeof(int));
npb=npa;

for (i=0;i<n1;i++)
{
for (j=0;j<n2;j++)
{
printf("請輸入整數:");
scanf("%d",npb);
npb++;
}
}

npb=nba;
/* 回復原來位址 */

for (i=0;i<n1;i++)
{
for (j=0;j<n2;j++)
{
printf("%d\t",*npb);
npb++;
}
printf("\n");
}
Post by Ptp
SAMS Teach yourself C for linux 書中第 234 頁指出
算術指標法不要遞或遞減陣列的變數, 例
$ cat list0803.c
/* Demonstrates using pointer arithmetic to access */
/* array elements with pointer notation. */
#include <stdio.h>
#define MAX 10
/* Declare and initialize an integer array. */
int i_array[MAX] = { 0,1,2,3,4,5,6,7,8,9 };
/* Declare a pointer to int and an int variable. */
int *i_ptr, count;
/* Declare and initialize a float array. */
float f_array[MAX] = { .0, .1, .2, .3, .4, .5, .6, .7, .8, .9 };
/* Declare a pointer to float. */
float *f_ptr;
int main(void)
{
/* Initialize the pointers. */
i_ptr = i_array;
f_ptr = f_array;
/* Print the array elements. */
for (count = 0; count < MAX; count++)
printf("%d\t%f\n", *i_ptr++, *f_ptr++);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^這一行若改為下面這行就不行
printf("%d\t%f\n", *i_array++, *f_array++); -->不行
return 0;
}
意思是否 iarray, farray 是 陣列的變數
應該使用 i_ptr,f_ptr 作指標算術 *i_ptr++, *f_ptr++?
陣列變數的位址不可改變,所以 i_array++ 和 f_array++ 都是錯的。
i_ptr,f_ptr 都是指標變數,所以 *i_ptr++, *f_ptr++ 是對的。

請不要忘了陣列變數和指標變數是不同的兩種東西,已經講了很多次了。
Post by Ptp
但另一個程式我試過可以
$ cat p.c
#include <stdio.h>
int main()
{
int *p,*q;
int a[10];
int i;
p=q=a;
for (i=0; i<10; i++)
{
a[i]=i;
printf("%d\n",*p++);
}
printf("p.q=%d\n",p-q);
p=q=a;
for (i=0; i<10; i++)
{
p[i]=i;
printf("%d\n",*a++);
^^^^^這裡可以
不曉得你的編譯器是誰發明的,我的 gcc 不行。
Post by Ptp
}
printf("p.q=%d\n",p-q);
兩個差別在那裡?
※ 來源:•良美家族總寨 hiperfect.com•[FROM: localhost]
老貢生
2003-11-07 04:43:10 UTC
Permalink
Post by Ptp
#include <stdio.h>
int main()
{
int i;
int *p,v,a[10];
p=a;
for (i=0;i<=9;i++)
{
*p=i*2;
p++;
若用這個迴圈, 第二個 for 執行會出現 Segmentation fault (core dumped)
printf("\n%d %d",a[i],i);
}
for (i=0;i<=9;i++)
{
printf("\n");
p[i]=i;
// *(p+i)=i;
// *(a+i)=i;
printf("%d %d",a[i],i);
}
return 0;
}
執行會出現 Segmentation fault (core dumped)
0 0
2 1
4 2
6 3
8 4
10 5
12 6
14 7
16 8
18 9
0 0
2 1
4 2
6 3
8 4
Segmentation fault (core dumped)
你的一連串問題,表示你沒有了解 C 語言指標變數的真正用法,
就這一部份你要去再加強。
K.Lee
2003-11-07 04:51:31 UTC
Permalink
那這樣看來是否 p[i] 比 p++ 好?
什麼情況才要用 p++ ?
1. int a[10],這實際上 index 是 0 ~ 9,所以迴圈應該是:

for(int i=0;i<9;i++) .....

2. p[i] 與 p++ 是完全沒有任何關係的。前面表示取目前 index
數值,p++ 表示移動到下一個 index 位置。

num = p[i]; // 取 p[i] 內容
p[i] = num; // 把 num 數值放到 p[i] 內

3. p++ 表示移動指標,既然你移動的指標位置,後面還要存取
認為是由原本起始位置開始,這當然是不大可行的。

for(i=0;i<10;i++)
*p++ = i;

for(i=0;i<10;i++)
*p++ = i ;

上面第二個 for loop 是會有問題的,因為 p 指標早就跑出原本正常區域了。
for (count = 0; count < MAX; count++)
printf("%d\t%f\n", *i_ptr++, *f_ptr++);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^這一行若改為下面這行就不行
printf("%d\t%f\n", *i_array++, *f_array++); -->不行
來看一下宣告吧。

int i_array[MAX] = { 0,1,2,3,4,5,6,7,8,9 };

[] 陣列沒有 +、- 這類 operator 操作。

i_array++ // 錯誤
++i_array // 錯誤
i_array-- // 錯誤
意思是否 iarray, farray 是 陣列的變數
應該使用 i_ptr,f_ptr 作指標算術 *i_ptr++, *f_ptr++?
但另一個程式我試過可以
int *p,*q;
int a[10];
for (i=0; i<10; i++)
{
p[i]=i;
printf("%d\n",*a++);
^^^^^這裡可以
}
printf("p.q=%d\n",p-q);
兩個差別在那裡?
編譯錯誤,error: wrong type argument to increment。

*a++,通常 a 表示指標,所以先取 *a,也就是指標本身儲存的變數值,
然後再進行 a++ 移動指標位置。

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
Ptp
2003-11-07 05:25:45 UTC
Permalink
¡i Šb letsgo. ªº€j§@€€Ž£šì: ¡j
: §Aªº€@³sŠê°ÝÃD¡Aªí¥Ü§AšSŠ³€FžÑ C »yš¥«üŒÐÅ܌ƪº¯u¥¿¥Îªk¡A
: ŽN³o€@³¡¥÷§A­n¥hŠA¥[±j¡C

ÁÂÁÂ, §Ú·|¥[±j

Šbœm²ß seive prime, select sort, binary search
œÒ¥»¥uŠ³šçŒÆ, €£€Ó·|¶Ç°}ŠCšìšçŒÆ, ²£¥ÍŒÆŸÚ, ŽúžÕ

https://61.56.78.240/c/

prime.c
sieveprime1.c
isprime.c
binarysearch.c
selsort.c

bitwise §ÚŠ³¶R C primer Plus 4/e šÓœm²ß

¡° šÓ·œ:¡Eš}¬ü®a±ÚÁ`¹ë hiperfect.com¡E[FROM: localhost]
老貢生
2003-11-07 05:43:42 UTC
Permalink
【 在 letsgo. 的大作中提到: 】
: 你的一連串問題,表示你沒有了解 C 語言指標變數的真正用法,
: 就這一部份你要去再加強。
謝謝, 我會加強
在練習 seive prime, select sort, binary search
課本只有函數, 不太會傳陣列到函數, 產生數據, 測試
https://61.56.78.240/c/
prime.c
sieveprime1.c
isprime.c
binarysearch.c
selsort.c
bitwise 我有買 C primer Plus 4/e 來練習
題外話,我的 C 都是從國內出版的簡簡單單學 C 這種書學來的,
你說的我一本都沒看過。可怎麼??......

是否你先簡單學一下比較好?

p.s.
純粹個人建議,並非否定專業。
老貢生
2003-11-07 05:54:22 UTC
Permalink
Post by 老貢生
【 在 letsgo. 的大作中提到: 】
: 你的一連串問題,表示你沒有了解 C 語言指標變數的真正用法,
: 就這一部份你要去再加強。
謝謝, 我會加強
在練習 seive prime, select sort, binary search
課本只有函數, 不太會傳陣列到函數, 產生數據, 測試
傳一維陣列:
int a[10];
add(a);

void add(int n[])
void add(int *n)

傳二維以上:
int a[5][10];
add(a);

void add(int n[][10])
void add(int (*n)[10]) /* 這裡就是陣列指標的用途 */
Post by 老貢生
https://61.56.78.240/c/
prime.c
sieveprime1.c
isprime.c
binarysearch.c
selsort.c
bitwise 我有買 C primer Plus 4/e 來練習
題外話,我的 C 都是從國內出版的簡簡單單學 C 這種書學來的,
你說的我一本都沒看過。可怎麼??......
是否你先簡單學一下比較好?
p.s.
純粹個人建議,並非否定專業。
Ptp
2003-11-07 07:16:38 UTC
Permalink
¡i Šb letsgo. ªº€j§@€€Ž£šì: ¡j
: ŠÑ°^¥Í wrote:
: > Ptp wrote:
: ¶Ç€@ºû°}ŠC¡G
: int a[10];
: add(a);
: void add(int n[])
: void add(int *n)
: ¶Ç€Gºû¥H€W¡G
: int a[5][10];
: add(a);
: void add(int n[][10])
: void add(int (*n)[10]) /* ³ožÌŽN¬O°}ŠC«üŒÐªº¥Î³~ */
: > ÃD¥~žÜ¡A§Úªº C ³£¬O±q°ê€º¥Xª©ªºÂ²Â²³æ³æŸÇ C ³oºØ®ÑŸÇšÓªº¡A
: > §A»¡ªº§Ú€@¥»³£šS¬Ý¹L¡C¥i«ç»ò??......
: > ¬O§_§A¥ý²³æŸÇ€@€U€ñžûŠn¡H
: > p.s.
: > ¯Âºé­Ó€H«Øij¡AšÃ«D§_©w±M·~¡C

$ cat matrixadd.c
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int maxtrix_add(int (*a)[4], int (*b)[4],int (*c)[4],int m,int n);
^
¬O€£¬OŠ]¬°(*ptr[4] Š³«ü©w²Ä€@ºû€ž¯À­ÓŒÆ
©Ò¥H³Ì«á€@ºû­n¶Ç€ž¯À­ÓŒÆµ¹¥Š?
a[] €@ºû
a[][4]€Gºû
a[][][4]€Tºû?

int main()
{

int pa[4][4] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13,14,15,16} };
int pb[4][4] = { {11, 12, 13, 14 },
{ 15, 16, 17, 18 },
{ 19, 110, 111, 112 },
{ 113,114,115,116} };
int pc[4][4] = { { 21, 22, 23, 24 },
{ 25, 26, 27, 28 },
{ 29, 210, 211, 212 },
{ 213,214,215,216} };


maxtrix_add(pa,pb,pc,4,4);

return 0;
}

int maxtrix_add(int (*a)[4], int (*b)[4],int (*c)[4],int m,int n)
{
int i,j;

for (i=0;i<m;i++)
for (j=0;j<n;j++)
c[i][j]=a[i][j]+b[i][j];

for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
printf("\na[%d][%d]=%d",i,j,a[i][j]);
printf("\t+ b[%d][%d]=%d",i,j,b[i][j]);
printf("\t= c[%d][%d]=%d",i,j,c[i][j]);
}

return 0;
}

€]©ñ https://61.56.78.240/c/

¡° šÓ·œ:¡Eš}¬ü®a±ÚÁ`¹ë hiperfect.com¡E[FROM: localhost]
老貢生
2003-11-08 07:01:36 UTC
Permalink
【 在 letsgo. 的大作中提到: 】
: 傳一維陣列:
: int a[10];
: add(a);
: void add(int n[])
: void add(int *n)
: 傳二維以上:
: int a[5][10];
: add(a);
: void add(int n[][10])
: void add(int (*n)[10]) /* 這裡就是陣列指標的用途 */
: > 題外話,我的 C 都是從國內出版的簡簡單單學 C 這種書學來的,
: > 你說的我一本都沒看過。可怎麼??......
: > 是否你先簡單學一下比較好?
: > p.s.
: > 純粹個人建議,並非否定專業。
$ cat matrixadd.c
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int maxtrix_add(int (*a)[4], int (*b)[4],int (*c)[4],int m,int n);
^
是不是因為(*ptr[4] 有指定第一維元素個數
所以最後一維要傳元素個數給它?
a[] 一維
a[][4]二維
a[][][4]三維?
錯誤在這裡------------------^^^^^^^^^^^^^
陣列傳遞,只有第一維能不固定寫出元素數目,其他維數
都要指明該維數元素數目是多少。
int main()
{
int pa[4][4] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13,14,15,16} };
int pb[4][4] = { {11, 12, 13, 14 },
{ 15, 16, 17, 18 },
{ 19, 110, 111, 112 },
{ 113,114,115,116} };
int pc[4][4] = { { 21, 22, 23, 24 },
{ 25, 26, 27, 28 },
{ 29, 210, 211, 212 },
{ 213,214,215,216} };
maxtrix_add(pa,pb,pc,4,4);
return 0;
}
int maxtrix_add(int (*a)[4], int (*b)[4],int (*c)[4],int m,int n)
{
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
c[i][j]=a[i][j]+b[i][j];
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
printf("\na[%d][%d]=%d",i,j,a[i][j]);
printf("\t+ b[%d][%d]=%d",i,j,b[i][j]);
printf("\t= c[%d][%d]=%d",i,j,c[i][j]);
}
return 0;
}
也放 https://61.56.78.240/c/
※ 來源:•良美家族總寨 hiperfect.com•[FROM: localhost]
Ptp
2003-11-07 07:30:57 UTC
Permalink
¡i Šb letsgo. ªº€j§@€€Ž£šì: ¡j
: > bitwise §ÚŠ³¶R C primer Plus 4/e šÓœm²ß
: ÃD¥~žÜ¡A§Úªº C ³£¬O±q°ê€º¥Xª©ªºÂ²Â²³æ³æŸÇ C ³oºØ®ÑŸÇšÓªº¡A
: §A»¡ªº§Ú€@¥»³£šS¬Ý¹L¡C¥i«ç»ò??......
: ¬O§_§A¥ý²³æŸÇ€@€U€ñžûŠn¡H
: p.s.
: ¯Âºé­Ó€H«Øij¡AšÃ«D§_©w±M·~¡C

¥u¬O­nŸÇ²ß¥Î bitwise °µ flag

­ì¥» if (isprime)
flag[n]=1
else
flag[n]=0


­Y¥Î bitwise šÓ³B²zœèŒÆªº flag
°²³]¥Î int flag; €@­Ó flag Š³ 16 bits šÓ°O¿ýŒÆŠr 1 ¡ã 16 šº­Ó¬OœèŒÆ€Î«DœèŒÆ
1 ¥NªíœèŒÆ, 0 ¥Nªí«DœèŒÆ, šÒŠp:
| 1 1 1 0 1 0 1 0
|--+--+--+--+--+--+--+--+
1 2 3 4 5 6 7 8

<< >> & ^ ~ | ©î¶}§ÚÀŽ
¹B¥ÎŠb€W­±ªºšÒ€lŽN€£·|€F

€]Œg€£¥X (173)=(10101101)2
Š]¬°¥Îªø°£ªk±ošìªºŸlŒÆ­nŠpŠó±N 0 €Î 1 ÅÜŠšŠrŠêŠXšÖŠb€@­ÓŠrŠê
ŠAÂàŠšŒÆŠr¶ÇŠ^?
¥Î»Œ°j­n¬°€°»ò­n­Œ¥H10 ?
ÁöµMŠ³²{ŠšªºšçŒÆ, Šý§Ú§Æ±æŠÛ€v·|¹B¥Î, °ÝÃD¬OÁÙ€£Œô±x
¬PŽÁ€é¥h¥úµØ§ä®Ñ, C primer Plus 4/e œĶÁÙ¯uŠ³ÂI $#@!$

¡° šÓ·œ:¡Eš}¬ü®a±ÚÁ`¹ë hiperfect.com¡E[FROM: localhost]
继续阅读narkive:
Loading...