#include <stdio.h>
#define JUDGE_POINT_TWO 1
int main()
{
#if JUDGE_POINT_TWO
char str[] = "qingjoin";
char *ptr = "c program";
char *point;
point = str;
point[2] = 'a';
point[3] = 'x';
printf("str=%s\n",str);
ptr[13] = 'm'; //這個地方是錯誤的
printf("ptr=%s\n",ptr);
#endif
}
編譯結果:
# gcc test_point.c -o test_point
# ./test_point
str=qiaxjoin
Segmentation fault
//char str[] = "qingjoin"; str就數組變量,當地址賦給point后。point[2]就是str[2],它的內容是可以改變的
//char *ptr = "c program"; 它是先定義一個常量,"c program" 這個常量是定義在“棧”里面,然后將這個常量的地址賦給ptr,而不是*ptr。常量是不能被修改的 所以ptr[13] = 'm'; 就會出錯
#include <stdio.h>
#define JUDGE_ONE 1
int main ()
{
#if JUDGE_ONE
int i = 129;
int num[] = {20,30,40,50};
int *p;
p = &i;
/**************************************************
這樣是正確的, 或int *p = &i 但 int *p=i這樣的話就是錯誤的
如果是 *p = i 這樣編譯時是不會出現錯誤,但程序運行的時候會出現段錯誤
原因是沒有給 p 分配內存它沒有空間去存放i 的值
**************************************************/
char *str;
*str = "qingjoin"; // 這種寫法是錯誤的。因為"qingjoin"是字符串,也是數組,在這里它是常量
str = "qingjoin" ; // 這種才是正確的 ,賦值的時候賦的是地址,它只能賦給指針變量str;
printf("%d\n",*p);
#endif
}
int w[5];
int *pw=w ; // pw表示數組w ,或者說指向變量w[0]
int *q=&w[2]; // q指向變量w[2]
int rr[10][5],(*pr)[5]; /* pr是指向一維數組的指針,該一維數組 有5個元素,每個元素是一個整數 */
pr=rr; // pr指向一維數組rr[0],該rr[0]有5個元素
int *qr[5]; /* qr是指針數組,有5個元素,每個元素是一個指向 int類型變量的指針 */
int *(tr[5]); /* 同qr 。tr是指針數組,有5個元素,每個元素是 一個指向int類型變量的指針 */
qr[1]=&y; // qr[1]指向變量 y