在我的系統(tǒng)中運行你 的程序和你想的一樣,是8不是7.
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設、網(wǎng)站制作、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務廣饒,十年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108
string 1,string 2:
it's a boy
boy
offset 8 "boy"in"it's a boy"
所謂指針就是地址,只是指針會區(qū)別它是什么指針,對應的數(shù)據(jù)占多大內存。如subst,str都是char*類型的,他們是字符指針,所以他們指向的類型是字符。*str和str[0]的含義是一樣的,意思是取得首字符。在c語言中字符串就是用字符指針來表示的,對應的是“%s”,而加上了*,是取這個字符指針地址的內容,也就是一個字符,用“%c”表示。所以你打印的是字符串,就應該用%s。
函數(shù)指針告訴CPU下一步需要執(zhí)行哪里的代碼的指針, 一數(shù)組十分相像.
#include?stdio.h
void?function(int?i,?double?d)????//一個函數(shù)的聲明
{
printf("函數(shù)運行,?%d,?%lf\n",?i,?d);
}
void?AnotherFunction(int?i,?double?d)????//另外一個函數(shù)聲明
{
printf("又一個函數(shù)運行,?%d,?%lf\n",?i,?d);
}
int?main()
{
void?(*pFun)(int,?double);????//定義了一個函數(shù)指針
int?(*p)(int?,?double);????//用于調試的函數(shù)指針
pFun?=?function;????//讓這個函數(shù)指針指向第一個函數(shù)
pFun(10,?10.101);????//通過這個函數(shù)指針來調用第一個函數(shù)
pFun?=?AnotherFunction;????//讓這個函數(shù)指針指向第二個函數(shù)
pFun(20,?20.202);????//通過這個函數(shù)指針來調用第二個函數(shù)
//若將以下代碼取消注釋,?就會產生錯誤
/*
p?=?function;
p?=?AnotherFunction;
//原因很簡單,?因為p是必須指向一個返回值為int,?第一個參數(shù)為int,?第二個參數(shù)為double的函數(shù),?但是在此代碼中定義的函數(shù)返回值是void
*/
//這個實驗中,?直接用函數(shù)名來賦值了,?是因為函數(shù)名其實就是這個函數(shù)的指針
//而在平常調用函數(shù)時,?都要加上(),?如:printf("");
//這里,?"()"就相當于'*'(就是取值運算符),?printf是函數(shù)指針,?就相當于是數(shù)組名,?即數(shù)組的首地址
return?0;
}
簡單地說指針就是指向變量和對象的地址。
指針的用途非常廣泛,比如如果你想通過函數(shù)改變一個變量的值,就得用指針而不能用值傳遞。還有在很多時候變量,特別是對象的數(shù)據(jù)量實在太大,程序員就會用指針來做形參,只需要傳遞一個地址就行,大大提高了效率。
1、變量的地址用運算符獲取。
int a;
float b;
int *pa; float *pb;
pa = a, pb = b; //這里用獲取,或者說表達式即是一個變量地址。
2、變量的地址,實際上是一個無符號整數(shù)類型。
int a = 2;
float b = 3;
if ((unsigned)a (unsigned) b)
printf("變量a的地址大于變量b的地址\n");
3、指針也是一個變量,也具備地址。
int a = 2;
int *pa = a;
int **ppa = pa; //ppa保存的是指針的地址
4、其它常用的指針形式
int *pa[2]; //指針數(shù)組,有指針變量組成的數(shù)組
int a[2][2] = {1,2,3,4};
int (*pa)[2] = a; //數(shù)組指針,指向具備2個整型元素的數(shù)組。
void hello() { ; }
void (*pfunc)(void); //函數(shù)指針
void *getaddr(int var_addr); //返回類型為指針的函數(shù)