1. 程式人生 > >創客學院9天C語言四

創客學院9天C語言四

①字串二:
strcasecmp忽略大小寫比較字串
strncmp(p,p1,n)比較指定長度字串
strchr(p,c)在字串中查詢指定字元
strstr(p,p1)查詢字串:
char s [] = “how are you”;
char subs = “are”;
printf ("%d\n",strstr (s,subs)-s);結果為4

isalpha()檢查是否為字母字元
isupper()大寫
islower()小寫
isdigit()數字

②指標:
記憶體單元的地址成為指標,專門用來存放地址的變數為指標變數。
<儲存型別> <資料型別> *<指標變數名>
char *pName

睜眼看了23年世界,越發認識自己的渺小;
歷史長河億分之一,你要很努力啊!

指標佔多少位元組,作業系統決定。
int a [20],*pa;
pa = a; //等價pa = &a [0]

兩指標相減得出一個整數值,表示相隔的資料個數。

#include <stdio.h>
int main(void)
{
    int a, b, i = 7;
    i++; //等價於i = i + 1;
    ++i; //等價於i = i + 1;
    a = i++; //等價於a = i; i = i + 1;
    b = ++i; //等價於i = i + 1; b = i;
    printf("a = %d, b = %d\n", a, b);
    
    return 0;
}
a = 9, b = 11

#include <stdio.h>
int main(void)
{
    int a = 5;
    int *p = &a;
    int b = (*p)++; //等價於b = a++; 即b = a; a = a + 1;
    int c = ++(*p); //等價於c = ++a; 即a = a + 1; c = a; 
    
    printf("b = %d, c = %d\n", b, c);
    printf("(*p)++ = %d, ++(*p) = %d\n", (*p)++, ++(*p));
 
    return 0;
}
b = 5, c = 7
(*p)++ = 8, ++(*p) = 8

#include <stdio.h>
int main(void)
{
    int arr[] = {1, 2, 3, 4};
    int *p = arr;
 
    int a = *p++; //等價於a = *(p++); 即a = *p; p = p + 1;
    int b = *++p; //等價於b = *(++p); 即p = p + 1; b = *p;    
    printf("a = %d, b = %d\n", a, b);
 
    return 0;
}
a = 1, b = 3


設指標變數px的地址值等於陣列指標x(即指標變數px指向陣列的首元數,則:
)x[i]、(px+i)、(x+i)和px[i]具有完全相同
的功能:訪問陣列第i+1個數組元素。

⑤陣列互換

{int a[]= {3,2,4,5,3,2,1};
  int *p,*q,n,t;
  n = sizeof (a) / sizeof (int);
  p = a ;
  q = &a[n-1];
   while (p<q)
   {
     t = *p;
	 *p = *q;
	 *q = t;
      p++;
	  q--;
   }
   for (t=0;t<n;t++)
      printf ("%d",a[t]);
	puts ("");
}	

⑥指標與二維陣列
二維陣列名代表陣列的起始地址,陣列名加1,是移動
一行元素。因此,二維陣列名常被稱為行地址。
例:

int a[3][2] = {{2,3},{2,6},[6,5}};
int * p,i,n;
n = sizeof (a)/ sizeof (int);

printf ("%p %p\n",a,a+1);// 輸出地址間隔一行的大小。c8,d0.
printf ("%p %p\n",*a,*a+1);// 同a[0],a[1].輸出為元素地址間隔四個位元組.c8,cc.

⑦行指標
儲存行地址的指標變數。形式如下:
<儲存型別> <資料型別> (*<指標變數>)[表示式]

int a[2][3];int (*p)[3].

例:

 int a[3][2] = {{2,3},{2,6},[6,5}};
 int (*p)[2];
 p = a;
 printf ("%d %d %d %d\n",a[1][1],p[1][1],*(*(a+1)+1),*(*(p+1)+1));
  列印結果皆為a[1][1].6

⑧字元指標和字串
▲當一個字元指標指向一個字串常量時,不能修改指標指向的物件的值。
char * p = “Hello ”;
*p = ‘h’; 錯誤

初始化字元指標是把記憶體中字串的首地址賦予指標,並不是把該字串複製到
指標中
char str[] = “hello world”;
char *p = str;
▲字串的連線

int main (int argc,char *arg[])
{
   char ch[100] = "welcome";
   char * p = "hello world";
   int i = 0;
   while (*(ch+i) != '\0')
        i ++;
   while (*p != '\0')	
    {
	  *(ch+i) = *p;
	  i++;
	  p++;
	
	}   
    *(ch+i) = *p;
	puts(ch);
	puts(p);
}

#include <stdio.h>
 #include <string.h>
 int main ()
 {
   char str[] = "hello";
   int len = strlen(str),i;
   // 直接輸出字串
   printf ("%s\n",str);
   // 每次輸出一個字元
   for (i=0;i<len;i++)
    {
	  printf ("%c",str[i]);
	}
	printf ("\n");
	return 0;
 }

⑨指標陣列

<儲存型別> <> <>
double * pa[2],a[2][3];
pa[0]=a[0];// 等價pa[0] = &a[0][0];
pa[1]= a[1]; //等價於pa[1]=&a[1][0];

int * p[3];
 int a[] = {3,4,3,2,5,3};
 p[0] = a;
 p[1] = a+1;
 p[2] = a+2;
 
 printf ("%d %d %d\n",a[0],a[1],a[2]);
 printf ("%d %d %d\n",*(p[0]),*(p[1]),*(p[2]));
 
 return 0;

⑩ 多級指標 略