friday, january 19, 2007 anyone who has never made a mistake has never tried anything new. -albert...

38
Friday, January 19, 2007 Anyone who has never made a mistake has never tried anything new. -Albert Einstein

Post on 19-Dec-2015

216 views

Category:

Documents


0 download

TRANSCRIPT

Friday, January 19, 2007

Anyone who has never made a mistake has never

tried anything new.  

-Albert Einstein

newdeleteStatic array: Size must be known at

compile timeint size;cin>>size;int array[size]; //Not allowed

newdeleteStatic array: Size must be known at compile

timeint size;cin>>size;int array[size]; //Not allowed

Dynamically allocated array: i.e On the fly, at runtime

int size;cin>>size;int* array=new int[size]; //OK

int size;cin>>size;int* array=new int[size];int i;for (i=0; i<size; i++){

array[i]=2*i;}for (i=0; i<size; i++){

cout<<array[i]<<endl; }delete []array;

pointers - dynamic allocation

When an array is an argument to a function, only address of the first element of the array is passed, not a copy of the entire array.

Array name without an index is a pointer to first element in the array.

Calling Functions with Arrays

void display(int num[]);

void fill_in(int num[]); /* C++ will automatically convert it to an integer pointer */

int main() {

int t[10],i;

fill_in(t); display(t);//pass array t to a function

return 0;

}

Calling Functions with Arrays

void fill_in(int num[]) {

int i;

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

num[i]=i;

}void display(int num[]) {

int i;

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

cout << num[i] << ' ';

}

Calling Functions with Arrays

void display(int num[10]);

void fill_in(int num[10]); /* C++ will automatically convert it to an integer pointer */

int main() {

int t[10],i;

fill_in(t); display(t);//pass array t to a function

return 0;

}

Calling Functions with Arrays

void fill_in(int num[10]) {

int i;

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

num[i]=i;

}void display(int num[10]) {

int i;

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

cout << num[i] << ' ';

}

Calling Functions with Arrays

void display(int *num)/* This method is most commonly used in

professionally written C++ programs when dealing with single dimensional numeric arrays*/

{

int i;

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

cout << num[i] << ' ';

}

Calling Functions with Arrays

void display(int *num);int main() {

int t[10], i;

fill_in(t);

display(t);

int *pt=t;

display(pt);

cout<<*pt;

return 0;

}

Calling Functions with Arrays

void display(int *num)

{

int i;

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

cout << *(num++) << ' ';

cout<<endl;

}

Calling Functions with Arrays

void cube(int *n, int num);

int main() {

int i, nums[10];

for(i=0; i<10; i++) nums[i] = i+1;

cout << "Original contents: ";

for(i=0; i<10; i++) cout << nums[i] << ' ';

cout << '\n';

cube(nums, 10); // compute cubes

cout << "Altered contents: ";

for(i=0; i<10; i++) cout << nums[i] << ' ';

return 0;

}

SELF TEST: Calling Functions with Arrays

void cube(int *n, int num) {

while(num) {

*n = (*n) * (*n) * (*n);

num--;

n++;

}

}

SELF TEST: Calling Functions with Arrays

void sqr_it(int *i); // prototype

int main() {

int x;

x = 10;

sqr_it(x);

return 0;

} //ERROR?

void sqr_it(int *i)

{

*i = (*i) * (*i);

}

SELF TEST: Functions

2-Dimensional Arrays

2-Dimentional Arrays as arguments to functions column size must be declared in

prototype

void print2D(int twoD[][2]){

int i,j;

for(i=0; i<2; i++){

for(j=0; j<2; j++){

cout<<twoD[i][j]<<endl; } }

twoD[1][1]=100;

}int main(){

int twoD[2][2]={1,2, 3,4};

print2D(twoD);

print2D(twoD);

return 0; }

1

2

3

4

1

2

3

100

char str1[80]="hello";

char str2[80]={"hello"};

char str3[80]={'h','e','l','l','o','\0'};

Initialization of strings

When the compiler encounters a string constant, it stores it in the program string table and generates a pointer to the string.

char *s; s = "Pointers are fun to use.\n"; cout << s;

What is wrong with following?

char str1[80];str1="cs192";

Strings

What is wrong with following?

char str1[80];str1="cs192"; //Error

Use strcpy(str1, “cs192”);

We can also initialize at the time of declaration.

Strings

int *pi[4];

int var=10;

pi[2] = &var; /* assign address of an integer var to third element of pointer array */

To find value of var:

*pi[2]

Arrays of Pointers

Make a memory drawing!

int main( ){

char *fortunes[5] = {

"Soon, you will come into some money.\n",

“You will see an old friend today.\n",

"You will live long and prosper.\n",

"Now is a good time to invest for the future.\n",

"A close friend will ask for a favor.\n"

};

cout<<fortunes[2]; //what is the output??

Initializing Arrays of Pointers

int chance, input, i;

cout << "To see your fortune, enter a random integer: ";

cin>>input;

// randomize the random number generator

for (i=0; i<input; i++) rand();

chance = rand();

chance = chance % 5;

cout << fortunes[chance];

return 0;

}

Self Test: Arrays of Pointers

int main(void){

char* entries[]={ {"ambidextrous"}, {"fata morgana"}, {"infrangible"}, {"serene"}, {"tousle"}

};

printentries(entries);

return 0; }

Calling Functions with Arrays

void printentries (char* ent[]){

int i;

for(i=0; i<5; i++){

cout<<ent[i]<<endl; }

}

int main(void){

char* entries[]={ {"ambidextrous"}, {"fata morgana"}, {"infrangible"}, {"serene"}, {"tousle"}

};

printentries(entries);

return 0; }

Calling Functions with Arrays

const int rows=13, cols=4; int i;

char *Harvest[rows][cols]= {

{"unknown month", " ", " ", " "},

{"sugar beet","cabbage","cauliflower", "Brussels sprouts"},

{"turnip", "radish", "caraway", "carrot"},

{"apple", "plum", "pear", "bean"},

{"peas", "clover", "lettuce", "onion"},

{"oat", "asparagus", "barley", "rye"},

{"maize", "wheat", "rice", "sugar cane"},

{"cotton", "cocoa", "tea", "grape"},

{"raspberry","hazelnut", "garlic", "ginger"},

{"potato", "sesame", "rye", "green gram"},

{"olive", "peppermint", "millet", "parsely"},

{"root mustard", "tomato", "jojoba", "fig"},

{"pecan", "thyme", "lime", "parsnip"}

};

cout<<Harvest[0]<<endl;

cout<<Harvest[0][0]<<endl;

cout<<Harvest[0][0][0]<<endl;

cout<<Harvest[0]<<endl;

cout<<Harvest[0][0]<<endl;

cout<<Harvest[0][0][0]<<endl;

0x0012FDE4

unknown month

u

for (i=0; i<cols; i++){

cout<<Harvest[2][i]<<"\t";

}

cout<<endl;

for (i=0; i<cols; i++){

cout<<Harvest[7][i]<<"\t";

}

cout<<endl;

turnip radish caraway carrot

cotton cocoa tea grape

int dept1=50, dept2=60, dept3=100, dept4=30;

int *production[2][2]= {{&dept1, &dept2},

{&dept3, &dept4} };

for (i=0; i<2; i++){

cout<<production[1][i]<<"\t";

}

cout<<endl;

for (i=0; i<2; i++){

cout<<*production[1][i]<<"\t";

}

0x0012FEB0 0x0012FEA4

100 30

void ptrprint2D(int *ptr2D[][2]){

int i,j;

for(i=0; i<2; i++){

for(j=0; j<2; j++){

cout<<*ptr2D[i][j]<<endl; } }}

int main(){

int a1=3, a2=4, a3=5, a4=6;

int* ptrtwoD[2][2]={&a1, &a2,

&a3, &a4};

ptrprint2D(ptrtwoD);

return 0;}

3

4

5

6

char* myFunction(char *strA, char *strB){

while (*strB){

*strA=*strB;

strA++;

strB++; }

return strA; }

int main(void) {

char stringa[]={"Rather Long String“};

char stringb[]={"bit short“};

char *pa=stringa;

char *pb=stringb;

char *pret;

pret=myFunction(pa, pb);

cout<<pa<<endl<<pb<<endl<<pret<<endl;

return 0;}

Functions that return pointers

bit shortng String

bit short

ng String