1. 程式人生 > >C 指標 陣列

C 指標 陣列

 //1  陣列名稱 與指標
 int a[5]={1,2,3,4,5};
 int *ptr=(int *)(&a+1);
 printf("%d,%d",*(a+1),*(ptr-1)); // 2,5

 //說明: &g+1的意思是陣列型別的常量指標加一 即 陣列長度加一

 printf("%0x \n", (a+1), (&a+1));
 // a+1   :代表陣列的值 第幾個 陣列下標(即 陣列第二個值的地址)
 // &a + 1: &取地址之後就代表這個地址的屬性是一個數組長度為單位的
 //         即 陣列首地址之後 4*5個位元組 後的地址, eg. 如下 0x00000111 的地址
 // 0x00000001 0x00000010 0x00000011 0x00000100 0x00000101 0x00000111 

 printf("%d \n", *(*(&array+1)-1)); // 5
 // A = &array+1 : 陣列第五個數後面的地址 用A代表
 // *(A)         :A地址被轉化為普通的指標
 // B = (*(A)-1) : int* 往前挪動一個值(4byte)
 // *(B)         : 取出這個地址的值
//2字串翻轉
void rev(char *p_rev)
{
char *p_start = p_rev;
char *p_end = p_rev;
char temp;

while(*(++p_end+1) != '\0');

while(p_start < p_end)
{
   temp = *p_start;
   *p_start++ = *p_end;
   *p_end-- = temp;
}
}
//3 一下為windows 32 下的C程式 計算sizeof的值:
char str[] = "Hello";
char *p = str;
int n = 1088;

cout << sizeof(str) << endl;             //   6
cout << *str << endl;                       //    H
cout << str << endl;                         //   Hello
cout << *p << endl;                         //     H
cout << p << endl;                          //    Hello                       
cout << &str << endl;                     //    0013FF68(地址)
cout << &p << endl;                         //    0013FF64(地址)
cout << sizeof(str) << endl;            //     6           
cout << sizeof(p) << endl;              //     4
cout << sizeof(n) << endl;              //      4
//4 c_itoa 函式
void itoa(int *p_num,char *str)
{
char *p_str = str;
char *p_rev = str;

int num = *p_num;
int i = 0;

if(num < 0)
{
   *p_str++ = '-';
   p_rev = p_str;
   num = 0 - num;
}

if(num == 0)
{
   *p_str++ = '0';
}

while(num > 0)
{
   p_str[i++] = num%10 + '0';
   num = num / 10;
}

rev(p_rev);

p_str[i] = '\0';
}

 

 

char* data = NULL;
data = "str123";

雙引號做了3件事:
1.申請了空間(在常量區),存放了字串
2. 在字串尾加上了’/0’
3.返回地址

char a[10] = “hello”; //這樣可以,這種情況是c語言初始化所支援的,和a[0] = ‘h’ a[1] = ‘e’…是一個道理,和普通陣列初始化一致
用變數a給出下面的定義 
a) 一個整型數(An integer) 
b) 一個指向整型數的指標(A pointer to an integer) 
c) 一個指向指標的的指標,它指向的指標是指向一個整型數(A pointer to a pointer to an integer) 
d) 一個有10個整型數的陣列(An array of 10 integers) 
e) 一個有10個指標的陣列,該指標是指向一個整型數的(An array of 10 pointers to integers) 
f) 一個指向有10個整型數陣列的指標(A pointer to an array of 10 integers) 
g) 一個指向函式的指標,該函式有一個整型引數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer) 
h) 一個有10個指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型數( An array of ten pointers to functions that take an integer argument and return an integer ) 答案是: 
a) int a; // An integer 
b) int *a; // A pointer to an integer 
c) int **a; // A pointer to a pointer to an integer 
d) int a[10]; // An array of 10 integers 
e) int *a[10]; // An array of 10 pointers to integers 
f) int (*a)[10]; // A pointer to an array of 10 integers 
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer 
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer


關於f:
typedef int tdArr[10];
typedef tdArr* tdpArr;
tdpArr pArr;

eg.
int a[10];
pArr = &a;
(*pArr)[1] = 12; //  不能把括號去掉 *pArr[1] = 12;


關於gf:
typedef int (tdFun)(int);
typedef tdFun* tdpFun;
tdpFun a[10];

eg.
int fun(int para)
{
  printf("para=%d \n", para);
  reutrn 0;
}

a[1] = fun;
(a[1])(12);